using System;
using Enyim.Caching;
using Enyim.Caching.Memcached;
using Microsoft.Extensions.Options;
using StackExchange.Redis;
namespace Infrastructure.Cache
{
///
/// 缓存redis实现
///
public sealed class RedisCacheContext : ICacheContext
{
private ConnectionMultiplexer _conn { get; set; }
private IDatabase iDatabase { get; set; }
public RedisCacheContext(IOptions options)
{
_conn = ConnectionMultiplexer.Connect(options.Value.RedisConf);
iDatabase = _conn.GetDatabase();
}
public override T Get(string key)
{
RedisValue value = iDatabase.StringGet(key);
if (!value.HasValue)
{
return default(T);
}
if (typeof(T) == typeof(string))
{
return (T) Convert.ChangeType(value, typeof(T));
}
else
{
return JsonHelper.Instance.Deserialize(value);
}
}
public override bool Set(string key, T t, DateTime expire)
{
if (typeof(T) == typeof(string))
{
return iDatabase.StringSet(key, t.ToString(), expire-DateTime.Now);
}
else
{
return iDatabase.StringSet(key, JsonHelper.Instance.Serialize(t), expire - DateTime.Now);
}
}
public override bool Remove(string key)
{
return iDatabase.KeyDelete(key);
}
}
}