需要在NuGet里面引用ServiceStack.Redis

  1. using ServiceStack.Redis;
  2. using ServiceStack.Redis.Generic;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace ConsoleRedisTest
  10. {
  11. /// <summary>
  12. /// 需要在AppSettings裡面配置redis連接字符串節點,名稱固定為“redisHost”
  13. /// 例如,格式參考 value="server=192.168.31.42;port=6380;password=pisenmaster;db=9"
  14. /// </summary>
  15. public class RedisTool : IDisposable
  16. {
  17.  
  18. /// <summary>
  19. /// redis主機ip
  20. /// </summary>
  21. private readonly static string RedisServerIP = string.Empty;// "192.168.31.42";
  22. /// <summary>
  23. /// 連接端口
  24. /// </summary>
  25. private readonly static int RedisPort = ;// 6380;
  26. /// <summary>
  27. /// 連接密碼
  28. /// </summary>
  29. private readonly static string RedisConnectPassword = string.Empty;// "pisenmaster";
  30. /// <summary>
  31. /// 缓冲池 實例db
  32. /// </summary>
  33. private readonly static string PooledRedisDB1 = string.Empty;// "pisenmaster@192.168.31.42:6380";
  34.  
  35. //默认缓存过期时间单位秒
  36. public const int secondsTimeOut = * ;
  37.  
  38. /// <summary>
  39. /// //加載配置文件
  40. /// </summary>
  41. static RedisTool()
  42. {
  43. string conStr = System.Configuration.ConfigurationManager.AppSettings["redisHost"];
  44. try
  45. {
  46. if (string.IsNullOrWhiteSpace(conStr))
  47. {
  48. throw new Exception("讀取配置文件出錯,AppSettings節沒有配置名為redisHost的redis連接字符串");
  49. }
  50. string[] arr = conStr.Split(';');
  51. RedisServerIP = arr.First(w => w.ToLower().Contains("server="))?.Split('=')[];
  52. RedisPort = Convert.ToInt32(arr.First(w => w.ToLower().Contains("port="))?.Split('=')[]);
  53. RedisConnectPassword = arr.First(w => w.ToLower().Contains("password="))?.Split('=')[];
  54. PooledRedisDB1 = $"{RedisConnectPassword}@{RedisServerIP}:{RedisPort}";
  55. }
  56. catch (Exception ex)
  57. {
  58. throw new Exception("讀取配置文件出錯,AppSettings節裡面沒有配置redis連接字符串名為redisHost的節");
  59. }
  60. }
  61.  
  62. /// <summary>
  63. /// redis客戶端
  64. /// </summary>
  65. public RedisClient Redis = new RedisClient(RedisServerIP, RedisPort, RedisConnectPassword, );
  66. //public RedisClient Redis = new RedisClient("192.168.31.42", 6380, "pisenmaster", 9);
  67.  
  68. //缓存池
  69. private PooledRedisClientManager prcm = new PooledRedisClientManager();
  70.  
  71. /// <summary>
  72. /// 构造函数
  73. /// </summary>
  74. /// <param name="OpenPooledRedis">是否开启缓冲池</param>
  75. public RedisTool(bool OpenPooledRedis = false)
  76. {
  77. if (OpenPooledRedis)
  78. {
  79. //prcm = CreateManager(new[] { "pisenmaster@192.168.31.42:6380" }, new[] { "pisenmaster@192.168.31.42:6380" });
  80. prcm = CreateManager(new[] { PooledRedisDB1 }, new[] { PooledRedisDB1 });
  81. Redis = prcm.GetClient() as RedisClient;
  82. }
  83. }
  84.  
  85. #region Key/Value存储
  86.  
  87. /// <summary>
  88. /// 设置缓存
  89. /// </summary>
  90. /// <typeparam name="T"></typeparam>
  91. /// <param name="key">缓存建</param>
  92. /// <param name="t">缓存值</param>
  93. /// <param name="timeout">过期时间,单位秒,-1:不过期,0:默认过期时间</param>
  94. /// <returns></returns>
  95. public bool Set<T>(string key, T t, int timeout = )
  96. {
  97. if (timeout < )
  98. {
  99. //永不過期
  100. return Redis.Set(key, t);
  101. }
  102. if (timeout == )
  103. {
  104. //默認時長
  105. timeout = secondsTimeOut;
  106. }
  107. return Redis.Set(key, t, TimeSpan.FromSeconds(timeout));
  108. }
  109.  
  110. /// <summary>
  111. /// 获取
  112. /// </summary>
  113. /// <typeparam name="T"></typeparam>
  114. /// <param name="key"></param>
  115. /// <returns></returns>
  116. public T Get<T>(string key)
  117. {
  118. return Redis.Get<T>(key);
  119. }
  120.  
  121. /// <summary>
  122. /// 删除
  123. /// </summary>
  124. /// <param name="key"></param>
  125. /// <returns></returns>
  126. public bool Remove(string key)
  127. {
  128. return Redis.Remove(key);
  129. }
  130.  
  131. public bool Add<T>(string key, T t, int timeout)
  132. {
  133. if (timeout < )
  134. {
  135. //永不過期
  136. return Redis.Set(key, t);
  137. }
  138. if (timeout == )
  139. {
  140. //默認時長
  141. timeout = secondsTimeOut;
  142. }
  143. return Redis.Add(key, t, TimeSpan.FromSeconds(timeout));
  144. }
  145.  
  146. #endregion
  147.  
  148. #region 链表操作
  149.  
  150. /// <summary>
  151. /// 根据IEnumerable数据添加链表
  152. /// </summary>
  153. /// <typeparam name="T"></typeparam>
  154. /// <param name="listId"></param>
  155. /// <param name="values"></param>
  156. /// <param name="timeout"></param>
  157. public void AddList<T>(string listId, IEnumerable<T> values, int timeout = )
  158. {
  159. IRedisTypedClient<T> iredisClient = Redis.As<T>();
  160. IRedisList<T> redisList = iredisClient.Lists[listId];
  161. redisList.AddRange(values);
  162. if (timeout >= )
  163. {
  164. if (timeout == )
  165. {
  166. timeout = secondsTimeOut;
  167. }
  168. Redis.ExpireEntryIn(listId, TimeSpan.FromSeconds(timeout));
  169. }
  170. iredisClient.Save();
  171. }
  172.  
  173. /// <summary>
  174. /// 添加单个实体到链表中
  175. /// </summary>
  176. /// <typeparam name="T"></typeparam>
  177. /// <param name="listId"></param>
  178. /// <param name="Item"></param>
  179. /// <param name="timeout">過期時間會覆蓋列表之前的過期時間,為-1時保持先前的過期設置</param>
  180. public void AddEntityToList<T>(string listId, T Item, int timeout = )
  181. {
  182. IRedisTypedClient<T> iredisClient = Redis.As<T>();
  183. IRedisList<T> redisList = iredisClient.Lists[listId];
  184. redisList.Add(Item);
  185. if (timeout >= )
  186. {
  187. if (timeout == )
  188. {
  189. timeout = secondsTimeOut;
  190. }
  191. Redis.ExpireEntryIn(listId, TimeSpan.FromSeconds(timeout));
  192. }
  193. iredisClient.Save();
  194. }
  195.  
  196. /// <summary>
  197. /// 获取链表
  198. /// </summary>
  199. /// <typeparam name="T"></typeparam>
  200. /// <param name="listId"></param>
  201. /// <returns></returns>
  202. public IEnumerable<T> GetList<T>(string listId)
  203. {
  204. IRedisTypedClient<T> iredisClient = Redis.As<T>();
  205. return iredisClient.Lists[listId];
  206. }
  207.  
  208. /// <summary>
  209. /// 在链表中删除单个实体
  210. /// </summary>
  211. /// <typeparam name="T"></typeparam>
  212. /// <param name="listId"></param>
  213. /// <param name="t"></param>
  214. public void RemoveEntityFromList<T>(string listId, T t)
  215. {
  216. IRedisTypedClient<T> iredisClient = Redis.As<T>();
  217. IRedisList<T> redisList = iredisClient.Lists[listId];
  218. redisList.RemoveValue(t);
  219. iredisClient.Save();
  220. }
  221.  
  222. /// <summary>
  223. /// 根据lambada表达式删除符合条件的实体
  224. /// </summary>
  225. /// <typeparam name="T"></typeparam>
  226. /// <param name="listId"></param>
  227. /// <param name="func"></param>
  228. public void RemoveEntityFromList<T>(string listId, Func<T, bool> func)
  229. {
  230. IRedisTypedClient<T> iredisClient = Redis.As<T>();
  231. IRedisList<T> redisList = iredisClient.Lists[listId];
  232. T value = redisList.Where(func).FirstOrDefault();
  233. redisList.RemoveValue(value);
  234. iredisClient.Save();
  235. }
  236.  
  237. #endregion
  238.  
  239. #region 清空Redis所有数据库中的所有key
  240. public void Flushall()
  241. {
  242. Redis.FlushAll();
  243. }
  244. #endregion
  245.  
  246. //释放资源
  247. public void Dispose()
  248. {
  249. if (Redis != null)
  250. {
  251. Redis.Dispose();
  252. Redis = null;
  253. }
  254. GC.Collect();
  255. }
  256.  
  257. /// <summary>
  258. /// 缓冲池
  259. /// </summary>
  260. /// <param name="readWriteHosts"></param>
  261. /// <param name="readOnlyHosts"></param>
  262. /// <returns></returns>
  263. public static PooledRedisClientManager CreateManager(
  264. string[] readWriteHosts, string[] readOnlyHosts)
  265. {
  266. return new PooledRedisClientManager(readWriteHosts, readOnlyHosts,
  267. new RedisClientManagerConfig
  268. {
  269. MaxWritePoolSize = readWriteHosts.Length * ,
  270. MaxReadPoolSize = readOnlyHosts.Length * ,
  271. AutoStart = true,
  272. });
  273. // { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) };
  274. }
  275. }
  276.  
  277. }

C# redis客户端帮助类的更多相关文章

  1. Redis进阶实践之九 独立封装的RedisClient客户端工具类

    一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己写了两个工具类,但是这两个工具类,没有提供一致的接口,是为了使用的独立 ...

  2. Redis进阶实践之九 独立封装的RedisClient客户端工具类(转载9)

    Redis进阶实践之九 独立封装的RedisClient客户端工具类 一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己 ...

  3. Redis客户端Java服务接口封装

    最近在学习Redis并集成到Spring中去,发现Spring的RedisTemplate并不好用,还没有MongoTemplate好用. 而且发现Jedis和ShardedJedis的方法非常多,覆 ...

  4. spring整合redis客户端及缓存接口设计(转)

    一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...

  5. spring整合redis客户端及缓存接口设计

    一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...

  6. c#实现redis客户端(一)

    最近项目使用中要改造redis客户端,看了下文档,总结分享一下. 阅读目录: 协议规范 基础通信 状态命令 set.get命令 管道.事务 总结 协议规范 redis允许客户端以TCP方式连接,默认6 ...

  7. Redis客户端之Spring整合Jedis,ShardedJedisPool集群配置

    Jedis设计 Jedis作为推荐的java语言redis客户端,其抽象封装为三部分: 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjec ...

  8. 【redis】02string类型和hash类型

    Redis的数据类型   Redis主要分为五个数据类型,一个是string,最简单的一个数据类型,hash,list, 还有set集合,还有zset有序集合,这是咱们redis的五种基础类型, 接下 ...

  9. Netty开发redis客户端,Netty发送redis命令,netty解析redis消息

    关键字:Netty开发redis客户端,Netty发送redis命令,netty解析redis消息, netty redis ,redis RESP协议.redis客户端,netty redis协议 ...

随机推荐

  1. jmeter的简单使用0723

    一.添加http请求 1.右击线程组---添加---取样器---http请求,具体内容如下图所示.如果请求带参数,则要点击下方的添加按钮来添加参数 2.查看请求结果,同样右击线程组-添加---监听器- ...

  2. django admin-过滤器

    django框架的admin模块,通过list_filter提供给用户自定义分类查询的接口,并且我们可以在原有类的基础上扩展出符合自身应用场景的过滤器. 定义模型 以 Student 模型为准,管理类 ...

  3. CentOS 7 的 redis 安装

    redis 安装 使用下面的命令,下载.解压.编译Redis: $ wget http://download.redis.io/releases/ $ tar xzf redis-x.x.x.tar. ...

  4. jquery 插入节点

    往某个元素内部的结尾添加 append() appendTo() append() <body> <button id="bt1">点击通过jQuery的a ...

  5. PC端自适应布局

    截止目前,国内绝大多数内容为主的网站(知乎,果壳,V2EX,网易新闻等)均使用内容区定宽布局,大多数电商网站(网易考拉,京东,聚美优品)也使用了内容区定宽的布局,也有些网站使用了自适应布局: 天猫 内 ...

  6. SparkSQL读写外部数据源--csv文件的读写

    object CSVFileTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() .ap ...

  7. React-Router常见API

    React-Router是React项目中处理路由的库. 1. HashRouter 通过hashchange监听路由的变化,通过window.location.hash赋值触发监听的变化. 本质是一 ...

  8. BCB6 如何跨工程(Project)进行源码级调试

    如何跨工程(Project)进行源码级调试 在日常工作中,如何跨工程(Project)进行源码级调试这是个无法回避的问题.例如:一个应用程序工程为“prj_A”,一个动态库工程为“prj_B”,“pr ...

  9. HTML5 离线应用

    一.离线应用cache manifes文件 HTML5中构建了一个离线(无网络状态)应用,只需创建一个cache manifest文件 可以配置需要的缓存的资源,网络无连接应用任然可以使用,本地读取缓 ...

  10. 洛谷 P1012 拼数

    P1012 拼数 标签 字符串 排序 NOIp提高组 1998 云端 难度 普及- 时空限制 1s / 128MB 题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例 ...