C# redis客户端帮助类
需要在NuGet里面引用ServiceStack.Redis
- using ServiceStack.Redis;
- using ServiceStack.Redis.Generic;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ConsoleRedisTest
- {
- /// <summary>
- /// 需要在AppSettings裡面配置redis連接字符串節點,名稱固定為“redisHost”
- /// 例如,格式參考 value="server=192.168.31.42;port=6380;password=pisenmaster;db=9"
- /// </summary>
- public class RedisTool : IDisposable
- {
- /// <summary>
- /// redis主機ip
- /// </summary>
- private readonly static string RedisServerIP = string.Empty;// "192.168.31.42";
- /// <summary>
- /// 連接端口
- /// </summary>
- private readonly static int RedisPort = ;// 6380;
- /// <summary>
- /// 連接密碼
- /// </summary>
- private readonly static string RedisConnectPassword = string.Empty;// "pisenmaster";
- /// <summary>
- /// 缓冲池 實例db
- /// </summary>
- private readonly static string PooledRedisDB1 = string.Empty;// "pisenmaster@192.168.31.42:6380";
- //默认缓存过期时间单位秒
- public const int secondsTimeOut = * ;
- /// <summary>
- /// //加載配置文件
- /// </summary>
- static RedisTool()
- {
- string conStr = System.Configuration.ConfigurationManager.AppSettings["redisHost"];
- try
- {
- if (string.IsNullOrWhiteSpace(conStr))
- {
- throw new Exception("讀取配置文件出錯,AppSettings節沒有配置名為redisHost的redis連接字符串");
- }
- string[] arr = conStr.Split(';');
- RedisServerIP = arr.First(w => w.ToLower().Contains("server="))?.Split('=')[];
- RedisPort = Convert.ToInt32(arr.First(w => w.ToLower().Contains("port="))?.Split('=')[]);
- RedisConnectPassword = arr.First(w => w.ToLower().Contains("password="))?.Split('=')[];
- PooledRedisDB1 = $"{RedisConnectPassword}@{RedisServerIP}:{RedisPort}";
- }
- catch (Exception ex)
- {
- throw new Exception("讀取配置文件出錯,AppSettings節裡面沒有配置redis連接字符串名為redisHost的節");
- }
- }
- /// <summary>
- /// redis客戶端
- /// </summary>
- public RedisClient Redis = new RedisClient(RedisServerIP, RedisPort, RedisConnectPassword, );
- //public RedisClient Redis = new RedisClient("192.168.31.42", 6380, "pisenmaster", 9);
- //缓存池
- private PooledRedisClientManager prcm = new PooledRedisClientManager();
- /// <summary>
- /// 构造函数
- /// </summary>
- /// <param name="OpenPooledRedis">是否开启缓冲池</param>
- public RedisTool(bool OpenPooledRedis = false)
- {
- if (OpenPooledRedis)
- {
- //prcm = CreateManager(new[] { "pisenmaster@192.168.31.42:6380" }, new[] { "pisenmaster@192.168.31.42:6380" });
- prcm = CreateManager(new[] { PooledRedisDB1 }, new[] { PooledRedisDB1 });
- Redis = prcm.GetClient() as RedisClient;
- }
- }
- #region Key/Value存储
- /// <summary>
- /// 设置缓存
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="key">缓存建</param>
- /// <param name="t">缓存值</param>
- /// <param name="timeout">过期时间,单位秒,-1:不过期,0:默认过期时间</param>
- /// <returns></returns>
- public bool Set<T>(string key, T t, int timeout = )
- {
- if (timeout < )
- {
- //永不過期
- return Redis.Set(key, t);
- }
- if (timeout == )
- {
- //默認時長
- timeout = secondsTimeOut;
- }
- return Redis.Set(key, t, TimeSpan.FromSeconds(timeout));
- }
- /// <summary>
- /// 获取
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="key"></param>
- /// <returns></returns>
- public T Get<T>(string key)
- {
- return Redis.Get<T>(key);
- }
- /// <summary>
- /// 删除
- /// </summary>
- /// <param name="key"></param>
- /// <returns></returns>
- public bool Remove(string key)
- {
- return Redis.Remove(key);
- }
- public bool Add<T>(string key, T t, int timeout)
- {
- if (timeout < )
- {
- //永不過期
- return Redis.Set(key, t);
- }
- if (timeout == )
- {
- //默認時長
- timeout = secondsTimeOut;
- }
- return Redis.Add(key, t, TimeSpan.FromSeconds(timeout));
- }
- #endregion
- #region 链表操作
- /// <summary>
- /// 根据IEnumerable数据添加链表
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="listId"></param>
- /// <param name="values"></param>
- /// <param name="timeout"></param>
- public void AddList<T>(string listId, IEnumerable<T> values, int timeout = )
- {
- IRedisTypedClient<T> iredisClient = Redis.As<T>();
- IRedisList<T> redisList = iredisClient.Lists[listId];
- redisList.AddRange(values);
- if (timeout >= )
- {
- if (timeout == )
- {
- timeout = secondsTimeOut;
- }
- Redis.ExpireEntryIn(listId, TimeSpan.FromSeconds(timeout));
- }
- iredisClient.Save();
- }
- /// <summary>
- /// 添加单个实体到链表中
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="listId"></param>
- /// <param name="Item"></param>
- /// <param name="timeout">過期時間會覆蓋列表之前的過期時間,為-1時保持先前的過期設置</param>
- public void AddEntityToList<T>(string listId, T Item, int timeout = )
- {
- IRedisTypedClient<T> iredisClient = Redis.As<T>();
- IRedisList<T> redisList = iredisClient.Lists[listId];
- redisList.Add(Item);
- if (timeout >= )
- {
- if (timeout == )
- {
- timeout = secondsTimeOut;
- }
- Redis.ExpireEntryIn(listId, TimeSpan.FromSeconds(timeout));
- }
- iredisClient.Save();
- }
- /// <summary>
- /// 获取链表
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="listId"></param>
- /// <returns></returns>
- public IEnumerable<T> GetList<T>(string listId)
- {
- IRedisTypedClient<T> iredisClient = Redis.As<T>();
- return iredisClient.Lists[listId];
- }
- /// <summary>
- /// 在链表中删除单个实体
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="listId"></param>
- /// <param name="t"></param>
- public void RemoveEntityFromList<T>(string listId, T t)
- {
- IRedisTypedClient<T> iredisClient = Redis.As<T>();
- IRedisList<T> redisList = iredisClient.Lists[listId];
- redisList.RemoveValue(t);
- iredisClient.Save();
- }
- /// <summary>
- /// 根据lambada表达式删除符合条件的实体
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="listId"></param>
- /// <param name="func"></param>
- public void RemoveEntityFromList<T>(string listId, Func<T, bool> func)
- {
- IRedisTypedClient<T> iredisClient = Redis.As<T>();
- IRedisList<T> redisList = iredisClient.Lists[listId];
- T value = redisList.Where(func).FirstOrDefault();
- redisList.RemoveValue(value);
- iredisClient.Save();
- }
- #endregion
- #region 清空Redis所有数据库中的所有key
- public void Flushall()
- {
- Redis.FlushAll();
- }
- #endregion
- //释放资源
- public void Dispose()
- {
- if (Redis != null)
- {
- Redis.Dispose();
- Redis = null;
- }
- GC.Collect();
- }
- /// <summary>
- /// 缓冲池
- /// </summary>
- /// <param name="readWriteHosts"></param>
- /// <param name="readOnlyHosts"></param>
- /// <returns></returns>
- public static PooledRedisClientManager CreateManager(
- string[] readWriteHosts, string[] readOnlyHosts)
- {
- return new PooledRedisClientManager(readWriteHosts, readOnlyHosts,
- new RedisClientManagerConfig
- {
- MaxWritePoolSize = readWriteHosts.Length * ,
- MaxReadPoolSize = readOnlyHosts.Length * ,
- AutoStart = true,
- });
- // { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) };
- }
- }
- }
C# redis客户端帮助类的更多相关文章
- Redis进阶实践之九 独立封装的RedisClient客户端工具类
一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己写了两个工具类,但是这两个工具类,没有提供一致的接口,是为了使用的独立 ...
- Redis进阶实践之九 独立封装的RedisClient客户端工具类(转载9)
Redis进阶实践之九 独立封装的RedisClient客户端工具类 一.引言 今天开始有关Redis学习的第九篇文章了,以后肯定会大量系统使用Redis作为缓存介质,为了更好的更好的Redis,自己 ...
- Redis客户端Java服务接口封装
最近在学习Redis并集成到Spring中去,发现Spring的RedisTemplate并不好用,还没有MongoTemplate好用. 而且发现Jedis和ShardedJedis的方法非常多,覆 ...
- spring整合redis客户端及缓存接口设计(转)
一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...
- spring整合redis客户端及缓存接口设计
一.写在前面 缓存作为系统性能优化的一大杀手锏,几乎在每个系统或多或少的用到缓存.有的使用本地内存作为缓存,有的使用本地硬盘作为缓存,有的使用缓存服务器.但是无论使用哪种缓存,接口中的方法都是差不多. ...
- c#实现redis客户端(一)
最近项目使用中要改造redis客户端,看了下文档,总结分享一下. 阅读目录: 协议规范 基础通信 状态命令 set.get命令 管道.事务 总结 协议规范 redis允许客户端以TCP方式连接,默认6 ...
- Redis客户端之Spring整合Jedis,ShardedJedisPool集群配置
Jedis设计 Jedis作为推荐的java语言redis客户端,其抽象封装为三部分: 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjec ...
- 【redis】02string类型和hash类型
Redis的数据类型 Redis主要分为五个数据类型,一个是string,最简单的一个数据类型,hash,list, 还有set集合,还有zset有序集合,这是咱们redis的五种基础类型, 接下 ...
- Netty开发redis客户端,Netty发送redis命令,netty解析redis消息
关键字:Netty开发redis客户端,Netty发送redis命令,netty解析redis消息, netty redis ,redis RESP协议.redis客户端,netty redis协议 ...
随机推荐
- jmeter的简单使用0723
一.添加http请求 1.右击线程组---添加---取样器---http请求,具体内容如下图所示.如果请求带参数,则要点击下方的添加按钮来添加参数 2.查看请求结果,同样右击线程组-添加---监听器- ...
- django admin-过滤器
django框架的admin模块,通过list_filter提供给用户自定义分类查询的接口,并且我们可以在原有类的基础上扩展出符合自身应用场景的过滤器. 定义模型 以 Student 模型为准,管理类 ...
- CentOS 7 的 redis 安装
redis 安装 使用下面的命令,下载.解压.编译Redis: $ wget http://download.redis.io/releases/ $ tar xzf redis-x.x.x.tar. ...
- jquery 插入节点
往某个元素内部的结尾添加 append() appendTo() append() <body> <button id="bt1">点击通过jQuery的a ...
- PC端自适应布局
截止目前,国内绝大多数内容为主的网站(知乎,果壳,V2EX,网易新闻等)均使用内容区定宽布局,大多数电商网站(网易考拉,京东,聚美优品)也使用了内容区定宽的布局,也有些网站使用了自适应布局: 天猫 内 ...
- SparkSQL读写外部数据源--csv文件的读写
object CSVFileTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() .ap ...
- React-Router常见API
React-Router是React项目中处理路由的库. 1. HashRouter 通过hashchange监听路由的变化,通过window.location.hash赋值触发监听的变化. 本质是一 ...
- BCB6 如何跨工程(Project)进行源码级调试
如何跨工程(Project)进行源码级调试 在日常工作中,如何跨工程(Project)进行源码级调试这是个无法回避的问题.例如:一个应用程序工程为“prj_A”,一个动态库工程为“prj_B”,“pr ...
- HTML5 离线应用
一.离线应用cache manifes文件 HTML5中构建了一个离线(无网络状态)应用,只需创建一个cache manifest文件 可以配置需要的缓存的资源,网络无连接应用任然可以使用,本地读取缓 ...
- 洛谷 P1012 拼数
P1012 拼数 标签 字符串 排序 NOIp提高组 1998 云端 难度 普及- 时空限制 1s / 128MB 题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例 ...