• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Redis性能大幅提升之Batch批量读写详解

    前言

    本文主要介绍的是关于Redis性能提升之Batch批量读写的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:

    提示:本文针对的是StackExchange.Redis

    一、问题呈现

    前段时间在开发的时候,遇到了redis批量读的问题,由于在StackExchange.Redis里面我确实没有找到PipeLine命令,找到的是Batch命令,因此对其用法进行了探究一下。

    下面的代码是我之前写的:

    public ListStudentEntity> Get(Listint> ids)
    {
      ListStudentEntity> result = new ListStudentEntity>();
      try
      {
       var db = RedisCluster.conn.GetDatabase();
       foreach (int id in ids.Keys)
       {
        string key = KeyManager.GetKey(id);
        var dic = db.HashGetAll(key).ToDictionary(k => k.Name, v => v.Value);
        StudentEntity se = new StudentEntity();
        if (dic.Keys.Contains(StudentEntityRedisHashKey.id.ToString()))
        {
         pe.id = FormatUtils.ConvertToInt32(dic[StudentEntityRedisHashKey.id.ToString()], -1);
        }
        if (dic.Keys.Contains(StudentEntityRedisHashKey.name.ToString()))
        {
         pe.name= dic[StudentEntityRedisHashKey.name.ToString()];
        }
        result.Add(se);
       }
       catch (Exception ex)
       {
       }
       return result;
    }

    从上面的代码中可以看出,并不是批量读,经过性能测试,性能确实是要远远低于用Batch操作,因为HashGetAll方法被执行了多次。

    下面给出批量方法:

    二、解决问题方法

    具体的用法是:

    var batch = db.CreateBatch();
    
    ...//这里写具体批量操作的方法
    
    batch.Execute();

    2.1批量写:

    具体代码:

    public bool InsertBatch(ListStudentEntity> seList)
    {
      bool result = false;
      try
      {
       var db = RedisCluster.conn.GetDatabase();
       var batch = db.CreateBatch();
       foreach (var se in seList)
       {
        string key = KeyManager.GetKey(se.id);
        batch.HashSetAsync(key, StudentEntityRedisHashKey.id.ToString(), te.id);
        batch.HashSetAsync(key, StudentEntityRedisHashKey.name.ToString(), te.name);
       }
       batch.Execute();
       result = true;
      }
      catch (Exception ex)
      {
      }
      return result;
    }

    这个方法里执行的是批量插入学生实体数据,这里只是针对Hash,其它的也一样操作。 

    2.2批量读:

    具体代码:

    public ListStudentEntity> GetBatch(Listint> ids)
    {
      ListStudentEntity> result = new ListStudentEntity>();
      ListTaskStackExchange.Redis.HashEntry[]>> valueList = new ListTaskStackExchange.Redis.HashEntry[]>>();
      try
      {
       var db = RedisCluster.conn.GetDatabase();
       var batch = db.CreateBatch();
       foreach(int id in ids)
       {
        string key = KeyManager.GetKey(id);
        TaskStackExchange.Redis.HashEntry[]> tres = batch.HashGetAllAsync(key);
        valueList.Add(tres);
       }
       batch.Execute();
    
       foreach(var hashEntry in valueList)
       {
        var dic = hashEntry.Result.ToDictionary(k => k.Name, v => v.Value);
        StudentEntity se= new StudentEntity();
        if (dic.Keys.Contains(StudentEntityRedisHashKey.id.ToString()))
        {
         se.id= FormatUtils.ConvertToInt32(dic[StudentEntityRedisHashKey.id.ToString()], -1);
        }
        if (dic.Keys.Contains(StudentEntityRedisHashKey.name.ToString()))
        {
         se.name= dic[StudentEntityRedisHashKey.name.ToString()];
        }
        result.Add(se);
       }
      }
      catch (Exception ex)
      {
      }
      return result;
    }

    这个方法是批量读取学生实体数据,批量拿到实体数据后,将其转化成我们需要的数据。下面给出性能对比。

    2.3性能对比:

    10条数据,约4-5倍差距:

       

    1000条数据,约28倍的差距:

     

    随着数据了增多,差距将越来越大。

    三、源码测试案例 

    上面是批量读写实体数据,下面给出StackExchange.Redis源码测试案例里的批量读写写法:

    public void TestBatchSent()
      {
       using (var muxer = Config.GetUnsecuredConnection())
       {
        var conn = muxer.GetDatabase(0);
        conn.KeyDeleteAsync("batch");
        conn.StringSetAsync("batch", "batch-sent");
        var tasks = new ListTask>();
        var batch = conn.CreateBatch();
        tasks.Add(batch.KeyDeleteAsync("batch"));
        tasks.Add(batch.SetAddAsync("batch", "a"));
        tasks.Add(batch.SetAddAsync("batch", "b"));
        tasks.Add(batch.SetAddAsync("batch", "c"));
        batch.Execute();
        
        var result = conn.SetMembersAsync("batch");
        tasks.Add(result);
        Task.WhenAll(tasks.ToArray());
        
        var arr = result.Result;
        Array.Sort(arr, (x, y) => string.Compare(x, y));
        ...
       }
      }

    这个方法里也给出了批量写和读的操作。

    总结

    好了,先说到这里了。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • 深入了解Redis的性能
    • asp.net性能优化之使用Redis缓存(入门)
    • 关于redis状态监控和性能调优详解
    上一篇:Redis安装配置与常用命令
    下一篇:动态添加Redis密码认证的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Redis性能大幅提升之Batch批量读写详解 Redis,性能,大幅,提升,之,