using System; using Newtonsoft.Json; using OSS.Tools.Cache; using StackExchange.Redis; namespace OSS.Tools.RedisCache { /// /// redis缓存实现类 /// public class ToolStackRedis : IToolCache { //redis数据库连接字符串 private readonly string ConnectionStr = null; // "mycache.redis.cache.windows.net,abortConnect=false, ssl=true,password=..." private readonly int _db = 0; // 静态变量 保证 sns_center模块 和 其他模块使用的是不同实例的相同链接 private static ConnectionMultiplexer connection; /// /// 构造函数 /// /// /// public ToolStackRedis(int db, string connectStr) { ConnectionStr = connectStr; this._db = db; } /// /// 缓存数据库 /// public ConnectionMultiplexer CacheConnection { get { if (connection == null || !connection.IsConnected) { connection = new Lazy(()=>ConnectionMultiplexer.Connect(ConnectionStr)).Value; } return connection; } } /// /// 缓存数据库 /// public IDatabase CacheRedis => CacheConnection.GetDatabase(_db); /// /// 添加缓存,已存在不更新 /// /// 添加缓存对象类型 /// 添加对象的key /// 值 /// 缓存时间 (redis目前都用绝对的) /// 绝对过期时间(此字段无用 redis目前都用绝对的) /// 是否添加成功 public bool Add(string key, T obj, TimeSpan slidingExpiration, DateTime? absoluteExpiration) { if (slidingExpiration == TimeSpan.Zero && absoluteExpiration == null) throw new ArgumentNullException(nameof(slidingExpiration), "缓存过期时间不正确,需要设置固定过期时间或者相对过期时间"); if (obj == null) return false; var jsonStr = JsonConvert.SerializeObject(obj); if (slidingExpiration == TimeSpan.Zero) { slidingExpiration = new TimeSpan(Convert.ToDateTime(absoluteExpiration).Ticks) - new TimeSpan(DateTime.Now.Ticks); } return CacheRedis.StringSet(key, jsonStr, slidingExpiration); } /// /// 获取缓存 /// /// /// /// public T Get(string key) { string value = CacheRedis.StringGet(key); if (string.IsNullOrEmpty(value)) return default(T); T result = JsonConvert.DeserializeObject(value); return result; } /// /// 移除缓存 /// /// /// public bool Remove(string key) { return CacheRedis.KeyDelete(key); } public bool Set(string key, T obj, TimeSpan slidingExpiration) { return Add(key, obj, slidingExpiration, null); } public bool Set(string key, T obj, DateTime absoluteExpiration) { return Add(key, obj, TimeSpan.Zero, absoluteExpiration); } [Obsolete] public bool AddOrUpdate(string key, T obj, TimeSpan slidingExpiration, DateTime? absoluteExpiration = null) { return Add(key, obj, slidingExpiration, absoluteExpiration); } } }