做者:依乐祝
本来连接:http://www.javashuo.com/article/p-xigxefmp-kv.htmlhtml
为何写这篇文章呢?由于.NET Core的生态愈来愈好了!以前玩转.net的时候操做Redis相信大伙都使用过一些组件,但都有一些缺点,如ServiceStack.Redis 是商业版,免费版有限制;StackExchange.Redis 是免费版,可是内核在 .NETCore 运行时常常有 Timeout的问题,暂没法解决(据农码一辈子大佬说:https://github.com/StackExchange/StackExchange.Redis/issues/871 试试StackExchange.Redis 2.0 呢,超时问题好像解决了。但仍是有朋友说,2.0也仍是会出现超时的问题)有兴趣的能够试试;csredis做者在 2014 年之后就没有更新了,它不支持 .net core,可是它的源码可读性很强很是干净,几乎无任何依赖。可是随着.NET Core生态的愈来愈好,又涌现了一批咱们国内大牛开发的支持.Net Core的Redis组件,供咱们选择。git
NewLife.Redis 他是NewLife团队开发的,已经在ZTO大数据实时计算中普遍应用,200多个Redis实例稳定工做一年多,天天处理近1亿包裹数据,日均调用量80亿次。github
CSRedis (这里我更喜欢把它叫作CSRedisCore)这是另外一个国内大牛nicye 开发的,为人很低调,因此了解他的人不多!目前我项目中普遍使用的也是这个。做者前不久刚作了一个几大Redis组件的性能测试.net core 2.0 redis驱动性能比拼 有兴趣的能够打开连接看一下。redis
注:此CSRedis(今天本文的主角CSRedisCore) 非彼CSRedis(.net 时代的组件,好久没更新了,不支持.net core)数据库
NewLife.Redis的使用方法在前两天的Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)文章中已经分享了!文章也有视频教程。因此今天的文章将介绍另外一个玩转Redis的神器-CSRedis了!c#
CSRedisCore的使用很简单,就须要实例化一个CSRedisClient(集群链接池)对象而后初始化一下RedisHelper就能够了,他的方法名与redis-cli基本保持一致。因此说你能够像使用redis-cli命令同样来使用它。做者最近也支持了Pipeline功能以及MGet,MSet等提升效率的功能!话很少少下面咱们将经过一个个实例来看下他的操做吧。缓存
获取Nuget包(目前版本3.0.18)!哈,没错,使用前要经过Nuget来安装下引用,什么?你不知道怎么使用Nuget包?对不起,右上角点下“X” 关掉网页就能够了。服务器
nuget Install-Package CSRedisCore
几种启动模式介绍:架构
普通模式:mvc
var csredis = new CSRedis.CSRedisClient("127.0.0.1:6379,password=123,defaultDatabase=13,poolsize=50,ssl=false,writeBuffer=10240,prefix=key前辍");
官方集群模式:假设你已经配置好 redis-trib 集群,定义一个【普通模式】的 CSRedisClient 对象,它会根据 redis-server 返回的 MOVED | ASK 错误记录slot,自动增长节点 Nodes 属性。
127.0.0.1:6379,password=123,defaultDatabase=0,poolsize=50,ssl=false,writeBuffer=10240,prefix=
其余节点在运行过程当中自动增长,确保每一个节点密码一致。
警告:本模式与【分区模式】同时使用时,切记不可设置“prefix=key前辍”(或者所有设置成同样),不然会致使 keySlot 计算结果与服务端不匹配,没法记录 slotCache。
注意:官方集群不支持多 keys 的命令、【管道】、Eval(脚本)等众多杀手级功能。
分区模式:本功能实现多个服务节点分担存储(做者本身实现的一种方式),与官方的分区、集群、高可用方案不一样。
例如:缓存数据达到500G,若是使用一台redis-server服务器光靠内存存储将很是吃力,使用硬盘又影响性能。
可使用此功能自动管理N台redis-server服务器分担存储,每台服务器只需约 (500/N)G 内存,且每台服务器匀能够配置官方高可用架构。
var csredis = new CSRedis.CSRedisClient(null, "127.0.0.1:6371,password=123,defaultDatabase=11,poolsize=10,ssl=false,writeBuffer=10240,prefix=key前辍", "127.0.0.1:6372,password=123,defaultDatabase=12,poolsize=11,ssl=false,writeBuffer=10240,prefix=key前辍", "127.0.0.1:6373,password=123,defaultDatabase=13,poolsize=12,ssl=false,writeBuffer=10240,prefix=key前辍", "127.0.0.1:6374,password=123,defaultDatabase=14,poolsize=13,ssl=false,writeBuffer=10240,prefix=key前辍"); //实现思路:根据key.GetHashCode() % 节点总数量,肯定连向的节点 //也能够自定义规则(第一个参数设置)
今天我只给你们演示怎么来进行使用,因此采用了普通模式,代码以下所示:
static void Main(string[] args) { //普通模式 var csredis = new CSRedis.CSRedisClient("127.0.0.1:6379,password=123,defaultDatabase=1,poolsize=50,ssl=false,writeBuffer=10240"); //初始化 RedisHelper RedisHelper.Initialization(csredis); //Install-Package Caching.CSRedis (本篇不须要) //注册mvc分布式缓存 //services.AddSingleton<IDistributedCache>(new Microsoft.Extensions.Caching.Redis.CSRedisCache(RedisHelper.Instance)); Test(); Console.ReadKey(); } static void Test() { RedisHelper.Set("name", "祝雷");//设置值。默认永不过时 //RedisHelper.SetAsync("name", "祝雷");//异步操做 Console.WriteLine(RedisHelper.Get<String>("name")); RedisHelper.Set("time", DateTime.Now, 1); Console.WriteLine(RedisHelper.Get<DateTime>("time")); Thread.Sleep(1100); Console.WriteLine(RedisHelper.Get<DateTime>("time")); // 列表 RedisHelper.RPush("list", "第一个元素"); RedisHelper.RPush("list", "第二个元素"); RedisHelper.LInsertBefore("list", "第二个元素", "我是新插入的第二个元素!"); Console.WriteLine($"list的长度为{RedisHelper.LLen("list")}"); //Console.WriteLine($"list的长度为{RedisHelper.LLenAsync("list")}");//异步 Console.WriteLine($"list的第二个元素为{RedisHelper.LIndex("list",1)}"); //Console.WriteLine($"list的第二个元素为{RedisHelper.LIndexAsync("list",1)}");//异步 // 哈希 RedisHelper.HSet("person","name", "zhulei"); RedisHelper.HSet("person", "sex", "男"); RedisHelper.HSet("person", "age", "28"); RedisHelper.HSet("person", "adress", "hefei"); Console.WriteLine($"person这个哈希中的age为{RedisHelper.HGet<int>("person","age")}"); //Console.WriteLine($"person这个哈希中的age为{RedisHelper.HGetAsync<int>("person", "age")}");//异步 // 集合 RedisHelper.SAdd("students","zhangsan", "lisi"); RedisHelper.SAdd("students", "wangwu"); RedisHelper.SAdd("students", "zhaoliu"); Console.WriteLine($"students这个集合的大小为{RedisHelper.SCard("students")}"); Console.WriteLine($"students这个集合是否包含wagnwu:{RedisHelper.SIsMember("students", "wangwu")}"); }
经过上面的代码你们能够看到对于Redis的操做都是使用RedisHelper这个类来实现的。并且,对Redis的全部操做名称都跟Redis-Cli命令高度一致!这样就会方便不少!同时对全部的方法在实现上都有同步异步的操做!这里建议进行Redis操做的话都尽可能使用同步操做。缘由在上篇也进行了介绍!这里就再也不次进行介绍了!。
执行的结果以下所示:
大#家能够摘录代码而后拷贝到一个新的控制台程序中运行便可!
上面给你们介绍了一些通用的使用方法,接下来呢咱们进行一些高级方法的使用。包括订阅/发布,PipeLine,缓存壳等等。
//普通订阅 RedisHelper.Subscribe( ("chan1", msg => Console.WriteLine(msg.Body)), ("chan2", msg => Console.WriteLine(msg.Body))); //模式订阅(通配符) RedisHelper.PSubscribe(new[] { "test*", "*test001", "test*002" }, msg => { Console.WriteLine($"PSUB {msg.MessageId}:{msg.Body} {msg.Pattern}: chan:{msg.Channel}"); }); //模式订阅已经解决的难题: //一、分区的节点匹配规则,致使通配符最大可能匹配所有节点,因此所有节点都要订阅 //二、本组 "test*", "*test001", "test*002" 订阅所有节点时,须要解决同一条消息不可执行屡次 //发布 RedisHelper.Publish("chan1", "123123123"); //不管是分区或普通模式,RedisHelper.Publish 均可以正常通讯
//不加缓存的时候,要从数据库查询 var t1 = Test.Select.WhereId(1).ToOne(); //通常的缓存代码,如不封装还挺繁琐的 var cacheValue = RedisHelper.Get("test1"); if (!string.IsNullOrEmpty(cacheValue)) { try { return JsonConvert.DeserializeObject(cacheValue); } catch { //出错时删除key RedisHelper.Remove("test1"); throw; } } var t1 = Test.Select.WhereId(1).ToOne(); RedisHelper.Set("test1", JsonConvert.SerializeObject(t1), 10); //缓存10秒 //使用缓存壳效果同上,如下示例使用 string 和 hash 缓存数据 var t1 = RedisHelper.CacheShell("test1", 10, () => Test.Select.WhereId(1).ToOne()); var t2 = RedisHelper.CacheShell("test", "1", 10, () => Test.Select.WhereId(1).ToOne()); var t3 = RedisHelper.CacheShell("test", new [] { "1", "2" }, 10, notCacheFields => new [] { ("1", Test.Select.WhereId(1).ToOne()), ("2", Test.Select.WhereId(2).ToOne()) });
使用管道模式,打包多条命令一块儿执行,从而提升性能。
var ret1 = RedisHelper.StartPipe().Set("a", "1").Get("a").EndPipe(); var ret2 = RedisHelper.StartPipe(p => p.Set("a", "1").Get("a")); var ret3 = RedisHelper.StartPipe().Get("b").Get("a").Get("a").EndPipe(); //与 RedisHelper.MGet("b", "a", "a") 性能相比,经测试差之毫厘
到这里你可能要问了,CSRedisCore性能如何呢?跟其余的Redis组件相比又如何呢、这里给出一个连接.net core 2.0 redis驱动性能比拼?.net core 2.0 redis驱动性能比拼,上面有做者作的测试,大伙能够看下,我也作个截图分享
做者交流QQ群:8578575
今天给你们介绍了.NET Core玩转Redis的又一傻瓜式神器CSRedisCore的使用,因为篇幅有限,因此还有不少方法没有进行演示。大伙能够按照本文的方法自行进行测试!(基本RedisCli里面有的命令,都有对应的方法实现!)看到.net core的生态愈来愈好!有不少优秀的工具以及框架在开源!做为.net Corer的你开森嘛?