前言

本文主要介绍的是关于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小时内与您取得联系。