全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

前言

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

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

一、问题呈现

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

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

public List<StudentEntity> Get(List<int> ids)
{
  List<StudentEntity> result = new List<StudentEntity>();
  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(List<StudentEntity> 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 List<StudentEntity> GetBatch(List<int> ids)
{
  List<StudentEntity> result = new List<StudentEntity>();
  List<Task<StackExchange.Redis.HashEntry[]>> valueList = new List<Task<StackExchange.Redis.HashEntry[]>>();
  try
  {
   var db = RedisCluster.conn.GetDatabase();
   var batch = db.CreateBatch();
   foreach(int id in ids)
   {
    string key = KeyManager.GetKey(id);
    Task<StackExchange.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 List<Task>();
    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  # batch  # 性能提升  # 批量读写  # 深入了解Redis的性能  # asp.net性能优化之使用Redis缓存(入门)  # 关于redis状态监控和性能调优详解  # 的是  # 好了  # 相关内容  # 说到  # 将其  # 对其  # 来看看  # 解决问题  # 可以看出  # 这篇文章  # 谢谢大家  # 没有找到  # 里也  # 前段时间  # 转化成  # 进行了  # 性能测试  # 有疑问  # db  # RedisCluster 


相关文章: 定制建站方案优化指南:企业官网开发与建站费用解析  学校为何禁止电信移动建设网站?  建站之星如何修改网站生成路径?  如何解决ASP生成WAP建站中文乱码问题?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  北京网站制作网页,网站升级改版需要多久?  浅析上传头像示例及其注意事项  如何在建站之星网店版论坛获取技术支持?  存储型VPS适合搭建中小型网站吗?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  网站制作需要会哪些技术,建立一个网站要花费多少?  济南专业网站制作公司,济南信息工程学校怎么样?  如何通过老薛主机一键快速建站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在新浪SAE免费搭建个人博客?  制作农业网站的软件,比较好的农业网站推荐一下?  建站之星logo尺寸如何设置最合适?  香港服务器如何优化才能显著提升网站加载速度?  ,网页ppt怎么弄成自己的ppt?  建站之星代理如何获取技术支持?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何选择CMS系统实现快速建站与SEO优化?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  常州企业网站制作公司,全国继续教育网怎么登录?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  Python lxml的etree和ElementTree有什么区别  如何高效利用亚马逊云主机搭建企业网站?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何用PHP快速搭建高效网站?分步指南  如何通过虚拟主机快速搭建个人网站?  如何在香港免费服务器上快速搭建网站?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何在云服务器上快速搭建个人网站?  如何零基础在云服务器搭建WordPress站点?  如何在阿里云域名上完成建站全流程?  javascript中对象的定义、使用以及对象和原型链操作小结  长沙企业网站制作哪家好,长沙水业集团官方网站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  网站app免费制作软件,能免费看各大网站视频的手机app?  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站之星如何实现PC+手机+微信网站五合一建站?  网站制作软件有哪些,制图软件有哪些?  Python文件管理规范_工程实践说明【指导】  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  html制作网站的步骤有哪些,iapp如何添加网页?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  Swift中switch语句区间和元组模式匹配  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。