当前位置: 移动技术网 > IT编程>开发语言>.net > .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

.NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

2018年11月13日  | 移动技术网IT编程  | 我要评论

平阳水头找富婆,五毛蛋,wangluogequ

作者:依乐祝
原本链接:

引子

为什么写这篇文章呢?因为.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组件,供我们选择。

  1. 他是newlife团队开发的,已经在zto大数据实时计算中广泛应用,200多个redis实例稳定工作一年多,每天处理近1亿包裹数据,日均调用量80亿次。

  2. csredis (这里我更喜欢把它叫做csrediscore)这是另一个国内大牛 开发的,为人很低调,所以了解他的人很少!目前我项目中广泛使用的也是这个。作者前不久刚做了一个几大redis组件的性能测试 有兴趣的可以打开链接看一下。

    注:此csredis(今天本文的主角csrediscore) 非彼csredis(.net 时代的组件,很久没更新了,不支持.net core)

newlife.redis的使用方法在前两天的redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)文章中已经分享了!文章也有视频教程。所以今天的文章将介绍另一个玩转redis的神器-csredis了!

基本使用

csrediscore的使用很简单,就需要实例化一个csredisclient(集群连接池)对象然后初始化一下redishelper就可以了,他的方法名与redis-cli基本保持一致。所以说你可以像使用redis-cli命令一样来使用它。作者最近也支持了pipeline功能以及mget,mset等提高效率的功能!话不多少下面我们将通过一个个实例来看下他的操作吧。

简单使用

  1. 获取nuget包(目前版本3.0.18)!哈,没错,使用前要通过nuget来安装下引用,什么?你不知道怎么使用nuget包?对不起,右上角点下“x” 关掉网页就可以了。

    nuget install-package csrediscore
  2. 几种启动模式介绍:

    • 普通模式:

      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() % 节点总数量,确定连向的节点
      //也可以自定义规则(第一个参数设置)
  3. 今天我只给大家演示怎么来进行使用,所以采用了普通模式,代码如下所示:

     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操作的话都尽量使用同步操作。原因在上篇也进行了介绍!这里就不再次进行介绍了!。

  4. 执行的结果如下所示:

    1542015107575

大#家可以摘录代码然后拷贝到一个新的控制台程序中运行即可!

高级使用

上面给大家介绍了一些通用的使用方法,接下来呢我们进行一些高级方法的使用。包括订阅/发布,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}");
});
//模式订阅已经解决的难题:
//1、分区的节点匹配规则,导致通配符最大可能匹配全部节点,所以全部节点都要订阅
//2、本组 "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())
});

pipeline及mget,mset

使用管道模式,打包多条命令一起执行,从而提高性能。

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驱动性能比拼,上面有作者做的测试,大伙可以看下,我也做个截图分享

1542015308886

作者交流群

作者交流qq群:8578575

总结

今天给大家介绍了.net core玩转redis的又一傻瓜式神器csrediscore的使用,由于篇幅有限,所以还有很多方法没有进行演示。大伙可以按照本文的方法自行进行测试!(基本rediscli里面有的命令,都有对应的方法实现!)看到.net core的生态越来越好!有很多优秀的工具以及框架在开源!作为.net corer的你开森嘛?

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网