using FluentEmail.Core; namespace Admin.NET.Core; public class RedisCache : FullRedis { /// /// Redis前缀 /// public string RedisPrefix { get; set; } /// 实例化增强版Redis public RedisCache() : base() { } /// 实例化增强版Redis /// /// /// public RedisCache(String server, String password, Int32 db) : base(server, password, db) { } /// 实例化增强版Redis /// public RedisCache(RedisOptions options) :base(options) { RedisPrefix = options.Prefix; } /// 按照配置服务实例化Redis,用于NETCore依赖注入 /// 服务提供者,将要解析IConfigProvider /// 缓存名称,也是配置中心key public RedisCache(IServiceProvider provider, String name) : base(provider, name) { } #region 基础操作 /// 缓存个数 public override Int32 Count => base.Count; /// 获取所有键,限制10000项,超额请使用FullRedis.Search public override ICollection Keys { get { if (string.IsNullOrWhiteSpace(RedisPrefix)) { return base.Keys; } else { return Execute(rds => rds.Execute("KEYS", RedisPrefix + "*")); } } } /// 获取信息 /// 是否获取全部信息,包括Commandstats /// public override IDictionary GetInfo(Boolean all = false) => base.GetInfo(all); /// 单个实体项 /// 键 /// 值 /// 过期时间,秒。小于0时采用默认缓存时间 public override Boolean Set(String key, T value, Int32 expire = -1) => base.Set(RedisPrefix+key,value,expire); /// 获取单体 /// 键 public override T Get(String key) => base.Get(RedisPrefix + key); /// 批量移除缓存项 /// 键集合 public override Int32 Remove(params String[] keys) { keys = keys.Select(key => RedisPrefix + key).ToArray(); return base.Remove(keys); } /// 清空所有缓存项 public override void Clear() => base.Clear(); /// 是否存在 /// 键 public override Boolean ContainsKey(String key) => base.ContainsKey(RedisPrefix + key); /// 设置缓存项有效期 /// 键 /// 过期时间 public override Boolean SetExpire(String key, TimeSpan expire) => base.SetExpire(RedisPrefix + key, expire); /// 获取缓存项有效期 /// 键 /// public override TimeSpan GetExpire(String key) => base.GetExpire(RedisPrefix + key); #endregion #region 集合操作 /// 批量获取缓存项 /// /// /// public override IDictionary GetAll(IEnumerable keys) { keys = keys.Select(key => RedisPrefix + key).ToArray(); return base.GetAll(keys); } /// 批量设置缓存项 /// /// /// 过期时间,秒。小于0时采用默认缓存时间 public override void SetAll(IDictionary values, Int32 expire = -1) { IDictionary keyValues = new Dictionary(); values.ForEach(item => { keyValues.Add(RedisPrefix + item.Key,item.Value); }); base.SetAll(keyValues, expire); } /// 获取哈希 /// 元素类型 /// 键 /// public override IDictionary GetDictionary(String key) => base.GetDictionary(RedisPrefix + key); /// 获取队列 /// 元素类型 /// 键 /// public override IProducerConsumer GetQueue(String key) => base.GetQueue(RedisPrefix + key); /// 获取栈 /// 元素类型 /// 键 /// public override IProducerConsumer GetStack(String key) => base.GetStack(RedisPrefix + key); /// 获取Set /// /// /// public override ICollection GetSet(String key) => base.GetSet(RedisPrefix + key); #endregion #region 高级操作 /// 添加,已存在时不更新 /// 值类型 /// 键 /// 值 /// 过期时间,秒。小于0时采用默认缓存时间 /// public override Boolean Add(String key, T value, Int32 expire = -1) => base.Add(RedisPrefix + key,value,expire); /// 设置新值并获取旧值,原子操作 /// 值类型 /// 键 /// 值 /// public override T Replace(String key, T value) => base.Replace(RedisPrefix + key, value); /// 尝试获取指定键,返回是否包含值。有可能缓存项刚好是默认值,或者只是反序列化失败 /// /// 在 Redis 中,可能有key(此时TryGet返回true),但是因为反序列化失败,从而得不到value。 /// /// 值类型 /// 键 /// 值。即使有值也不一定能够返回,可能缓存项刚好是默认值,或者只是反序列化失败 /// 返回是否包含值,即使反序列化失败 public override Boolean TryGetValue(String key, out T value) => base.TryGetValue(RedisPrefix + key,out value); /// 累加,原子操作 /// 键 /// 变化量 /// public override Int64 Increment(String key, Int64 value) => base.Increment(RedisPrefix + key, value); /// 累加,原子操作,乘以100后按整数操作 /// 键 /// 变化量 /// public override Double Increment(String key, Double value) => base.Increment(RedisPrefix + key, value); /// 递减,原子操作 /// 键 /// 变化量 /// public override Int64 Decrement(String key, Int64 value) => base.Decrement(RedisPrefix + key, value); /// 递减,原子操作,乘以100后按整数操作 /// 键 /// 变化量 /// public override Double Decrement(String key, Double value) => base.Decrement(RedisPrefix + key, value); #endregion }