RedisManager.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using System;
  2. using System.Collections.Generic;
  3. using ServiceStack.Redis;
  4. using CP.Cache.Redis.Config;
  5. using Newtonsoft.Json;
  6. using ServiceStack.Text;
  7. namespace CP.Cache.Redis
  8. {
  9. public class RedisManager : ICache
  10. {
  11. static PooledRedisClientManager pooledRedis;
  12. static RedisManager()
  13. {
  14. RedisConfig redis = RedisConfigPool.GetRedisConfig();
  15. List<string> readWriteHosts = new List<string>();
  16. var readOnlyHosts = new List<string>();
  17. redis.ReadWriteHosts.ForEach(p =>
  18. {
  19. readWriteHosts.Add(p.Host);
  20. });
  21. redis.ReadOnlyHosts.ForEach(p =>
  22. {
  23. readOnlyHosts.Add(p.Host);
  24. });
  25. pooledRedis = new PooledRedisClientManager(readWriteHosts.ToArray(), readOnlyHosts.ToArray(), redis.RedisClientManagerConfig);
  26. }
  27. public static IRedisClient GetClient()
  28. {
  29. RedisConfig redisConfig = RedisConfigPool.GetRedisConfig();
  30. IRedisClient redis = pooledRedis.GetClient();
  31. if (redisConfig.ConnectTimeout > 0)
  32. {
  33. redis.ConnectTimeout = redisConfig.ConnectTimeout;
  34. }
  35. if (redisConfig.RetryCount > 0)
  36. {
  37. redis.RetryCount = redisConfig.RetryCount;
  38. }
  39. if (redisConfig.RetryTimeout > 0)
  40. {
  41. redis.RetryTimeout = redisConfig.RetryTimeout;
  42. }
  43. if (redisConfig.SendTimeout > 0)
  44. {
  45. redis.SendTimeout = redisConfig.SendTimeout;
  46. }
  47. redis.Password = redisConfig.Password;
  48. return redis;
  49. }
  50. public bool IsExist(string key)
  51. {
  52. using (IRedisClient redis = GetClient())
  53. {
  54. return redis.ContainsKey(key);
  55. }
  56. }
  57. /// <summary>
  58. /// 添加实体集合到缓存中
  59. /// </summary>
  60. /// <param name="key">缓存键</param>
  61. /// <typeparam name="T">实体类型</typeparam>
  62. /// <param name="entities">实体集合</param>
  63. /// <returns>成功返回True,失败返回False</returns>
  64. public void AddObject<T>(string key, T t, int expires = 0)
  65. {
  66. using (IRedisClient redis = GetClient())
  67. {
  68. if (expires > 0)
  69. redis.Set<T>(key, t, DateTime.Now.AddMinutes(expires));
  70. else
  71. redis.Set<T>(key, t);
  72. }
  73. }
  74. /// <summary>
  75. /// 返回T
  76. /// </summary>
  77. /// <typeparam name="T"></typeparam>
  78. /// <param name="key"></param>
  79. /// <returns></returns>
  80. public T GetObject<T>(string key)
  81. {
  82. var tp = typeof(T);
  83. if (tp.IsArray)
  84. {
  85. return JsonConvert.DeserializeObject<T>(GetString(key));
  86. }
  87. using (IRedisClient redis = GetClient())
  88. {
  89. return redis.Get<T>(key);
  90. }
  91. }
  92. /// <summary>
  93. /// 获取文本
  94. /// </summary>
  95. /// <param name="key">缓存键名</param>
  96. /// <returns>返回对应的键值或者string.Empty</returns>
  97. public string GetString(string key)
  98. {
  99. return GetObject<string>(key);
  100. }
  101. /// <summary>
  102. /// 获取所有键
  103. /// </summary>
  104. /// <returns>返回所有缓存键</returns>
  105. public List<string> GetKeys()
  106. {
  107. using (IRedisClient redis = GetClient())
  108. {
  109. return redis.GetAllKeys();
  110. }
  111. }
  112. /// <summary>
  113. /// 删除指定键缓存
  114. /// </summary>
  115. /// <param name="key">键名</param>
  116. /// <returns>成功返回True,失败返回False</returns>
  117. public void RemoveObject(string key)
  118. {
  119. using (IRedisClient redis = GetClient())
  120. {
  121. redis.Remove(key);
  122. }
  123. }
  124. /// <summary>
  125. /// 批量移出类型key的对像
  126. /// </summary>
  127. /// <param name="key"></param>
  128. public void RemoveObjectByRegex(string key)
  129. {
  130. var list = GetKeys();
  131. if (list != null && list.Count > 0)
  132. {
  133. foreach(string item in list)
  134. {
  135. if (item.IndexOf(key, StringComparison.CurrentCultureIgnoreCase) != -1)
  136. RemoveObject(key);
  137. }
  138. }
  139. }
  140. /// <summary>
  141. /// 删除指定键缓存
  142. /// </summary>
  143. /// <param name="keys">键名</param>
  144. public void RemoveAll()
  145. {
  146. using (IRedisClient redis = GetClient())
  147. {
  148. List<string> keys = GetKeys();
  149. redis.RemoveAll(keys);
  150. }
  151. }
  152. }
  153. }