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.Conn); iDatabase = _conn.GetDatabase(options.Value.RedisConf.Database); } 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); } public override Task Lock(string id, Func> func, string key = "hc") { return func(id); } } }