RedisCache.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. using FluentEmail.Core;
  2. namespace Admin.NET.Core;
  3. public class RedisCache : FullRedis
  4. {
  5. /// <summary>
  6. /// Redis前缀
  7. /// </summary>
  8. public string RedisPrefix { get; set; }
  9. /// <summary>实例化增强版Redis</summary>
  10. public RedisCache() : base() { }
  11. /// <summary>实例化增强版Redis</summary>
  12. /// <param name="server"></param>
  13. /// <param name="password"></param>
  14. /// <param name="db"></param>
  15. public RedisCache(String server, String password, Int32 db) : base(server, password, db) { }
  16. /// <summary>实例化增强版Redis</summary>
  17. /// <param name="options"></param>
  18. public RedisCache(RedisOptions options) :base(options) {
  19. RedisPrefix = options.Prefix;
  20. }
  21. /// <summary>按照配置服务实例化Redis,用于NETCore依赖注入</summary>
  22. /// <param name="provider">服务提供者,将要解析IConfigProvider</param>
  23. /// <param name="name">缓存名称,也是配置中心key</param>
  24. public RedisCache(IServiceProvider provider, String name) : base(provider, name) { }
  25. #region 基础操作
  26. /// <summary>缓存个数</summary>
  27. public override Int32 Count => base.Count;
  28. /// <summary>获取所有键,限制10000项,超额请使用FullRedis.Search</summary>
  29. public override ICollection<String> Keys
  30. {
  31. get
  32. {
  33. if (string.IsNullOrWhiteSpace(RedisPrefix))
  34. {
  35. return base.Keys;
  36. }
  37. else {
  38. return Execute(rds => rds.Execute<String[]>("KEYS", RedisPrefix + "*"));
  39. }
  40. }
  41. }
  42. /// <summary>获取信息</summary>
  43. /// <param name="all">是否获取全部信息,包括Commandstats</param>
  44. /// <returns></returns>
  45. public override IDictionary<String, String> GetInfo(Boolean all = false) => base.GetInfo(all);
  46. /// <summary>单个实体项</summary>
  47. /// <param name="key">键</param>
  48. /// <param name="value">值</param>
  49. /// <param name="expire">过期时间,秒。小于0时采用默认缓存时间<seealso cref="Cache.Expire"/></param>
  50. public override Boolean Set<T>(String key, T value, Int32 expire = -1) => base.Set<T>(RedisPrefix+key,value,expire);
  51. /// <summary>获取单体</summary>
  52. /// <param name="key">键</param>
  53. public override T Get<T>(String key) => base.Get<T>(RedisPrefix + key);
  54. /// <summary>批量移除缓存项</summary>
  55. /// <param name="keys">键集合</param>
  56. public override Int32 Remove(params String[] keys)
  57. {
  58. keys = keys.Select(key => RedisPrefix + key).ToArray();
  59. return base.Remove(keys);
  60. }
  61. /// <summary>清空所有缓存项</summary>
  62. public override void Clear() => base.Clear();
  63. /// <summary>是否存在</summary>
  64. /// <param name="key">键</param>
  65. public override Boolean ContainsKey(String key) => base.ContainsKey(RedisPrefix + key);
  66. /// <summary>设置缓存项有效期</summary>
  67. /// <param name="key">键</param>
  68. /// <param name="expire">过期时间</param>
  69. public override Boolean SetExpire(String key, TimeSpan expire) => base.SetExpire(RedisPrefix + key, expire);
  70. /// <summary>获取缓存项有效期</summary>
  71. /// <param name="key">键</param>
  72. /// <returns></returns>
  73. public override TimeSpan GetExpire(String key) => base.GetExpire(RedisPrefix + key);
  74. #endregion
  75. #region 集合操作
  76. /// <summary>批量获取缓存项</summary>
  77. /// <typeparam name="T"></typeparam>
  78. /// <param name="keys"></param>
  79. /// <returns></returns>
  80. public override IDictionary<String, T> GetAll<T>(IEnumerable<String> keys) {
  81. keys = keys.Select(key => RedisPrefix + key).ToArray();
  82. return base.GetAll<T>(keys);
  83. }
  84. /// <summary>批量设置缓存项</summary>
  85. /// <typeparam name="T"></typeparam>
  86. /// <param name="values"></param>
  87. /// <param name="expire">过期时间,秒。小于0时采用默认缓存时间<seealso cref="Cache.Expire"/></param>
  88. public override void SetAll<T>(IDictionary<String, T> values, Int32 expire = -1)
  89. {
  90. IDictionary<String, T> keyValues = new Dictionary<String, T>();
  91. values.ForEach(item =>
  92. {
  93. keyValues.Add(RedisPrefix + item.Key,item.Value);
  94. });
  95. base.SetAll(keyValues, expire);
  96. }
  97. /// <summary>获取哈希</summary>
  98. /// <typeparam name="T">元素类型</typeparam>
  99. /// <param name="key">键</param>
  100. /// <returns></returns>
  101. public override IDictionary<String, T> GetDictionary<T>(String key) => base.GetDictionary<T>(RedisPrefix + key);
  102. /// <summary>获取队列</summary>
  103. /// <typeparam name="T">元素类型</typeparam>
  104. /// <param name="key">键</param>
  105. /// <returns></returns>
  106. public override IProducerConsumer<T> GetQueue<T>(String key) => base.GetQueue<T>(RedisPrefix + key);
  107. /// <summary>获取栈</summary>
  108. /// <typeparam name="T">元素类型</typeparam>
  109. /// <param name="key">键</param>
  110. /// <returns></returns>
  111. public override IProducerConsumer<T> GetStack<T>(String key) => base.GetStack<T>(RedisPrefix + key);
  112. /// <summary>获取Set</summary>
  113. /// <typeparam name="T"></typeparam>
  114. /// <param name="key"></param>
  115. /// <returns></returns>
  116. public override ICollection<T> GetSet<T>(String key) => base.GetSet<T>(RedisPrefix + key);
  117. #endregion
  118. #region 高级操作
  119. /// <summary>添加,已存在时不更新</summary>
  120. /// <typeparam name="T">值类型</typeparam>
  121. /// <param name="key">键</param>
  122. /// <param name="value">值</param>
  123. /// <param name="expire">过期时间,秒。小于0时采用默认缓存时间<seealso cref="Cache.Expire"/></param>
  124. /// <returns></returns>
  125. public override Boolean Add<T>(String key, T value, Int32 expire = -1) => base.Add<T>(RedisPrefix + key,value,expire);
  126. /// <summary>设置新值并获取旧值,原子操作</summary>
  127. /// <typeparam name="T">值类型</typeparam>
  128. /// <param name="key">键</param>
  129. /// <param name="value">值</param>
  130. /// <returns></returns>
  131. public override T Replace<T>(String key, T value) => base.Replace<T>(RedisPrefix + key, value);
  132. /// <summary>尝试获取指定键,返回是否包含值。有可能缓存项刚好是默认值,或者只是反序列化失败</summary>
  133. /// <remarks>
  134. /// 在 Redis 中,可能有key(此时TryGet返回true),但是因为反序列化失败,从而得不到value。
  135. /// </remarks>
  136. /// <typeparam name="T">值类型</typeparam>
  137. /// <param name="key">键</param>
  138. /// <param name="value">值。即使有值也不一定能够返回,可能缓存项刚好是默认值,或者只是反序列化失败</param>
  139. /// <returns>返回是否包含值,即使反序列化失败</returns>
  140. public override Boolean TryGetValue<T>(String key, out T value) => base.TryGetValue<T>(RedisPrefix + key,out value);
  141. /// <summary>累加,原子操作</summary>
  142. /// <param name="key">键</param>
  143. /// <param name="value">变化量</param>
  144. /// <returns></returns>
  145. public override Int64 Increment(String key, Int64 value) => base.Increment(RedisPrefix + key, value);
  146. /// <summary>累加,原子操作,乘以100后按整数操作</summary>
  147. /// <param name="key">键</param>
  148. /// <param name="value">变化量</param>
  149. /// <returns></returns>
  150. public override Double Increment(String key, Double value) => base.Increment(RedisPrefix + key, value);
  151. /// <summary>递减,原子操作</summary>
  152. /// <param name="key">键</param>
  153. /// <param name="value">变化量</param>
  154. /// <returns></returns>
  155. public override Int64 Decrement(String key, Int64 value) => base.Decrement(RedisPrefix + key, value);
  156. /// <summary>递减,原子操作,乘以100后按整数操作</summary>
  157. /// <param name="key">键</param>
  158. /// <param name="value">变化量</param>
  159. /// <returns></returns>
  160. public override Double Decrement(String key, Double value) => base.Decrement(RedisPrefix + key, value);
  161. #endregion
  162. }