Redis性能大幅提升之Batch批量读写详解
发布时间 - 2026-01-11 01:43:10 点击率:次前言

本文主要介绍的是关于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
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
网站图片在线制作软件,怎么在图片上做链接?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel如何实现模型的全局作用域?(Global Scope示例)
微信小程序 HTTPS报错整理常见问题及解决方案
如何在万网ECS上快速搭建专属网站?
Mybatis 中的insertOrUpdate操作
详解jQuery停止动画——stop()方法的使用
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
如何在阿里云香港服务器快速搭建网站?
如何在建站之星绑定自定义域名?
phpredis提高消息队列的实时性方法(推荐)
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Laravel storage目录权限问题_Laravel文件写入权限设置
MySQL查询结果复制到新表的方法(更新、插入)
黑客如何通过漏洞一步步攻陷网站服务器?
如何在云指建站中生成FTP站点?
昵图网官方站入口 昵图网素材图库官网入口
如何在阿里云部署织梦网站?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Java类加载基本过程详细介绍
如何在搬瓦工VPS快速搭建网站?
专业商城网站制作公司有哪些,pi商城官网是哪个?
北京网站制作的公司有哪些,北京白云观官方网站?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
详解Huffman编码算法之Java实现
如何快速搭建高效简练网站?
Laravel如何使用模型观察者?(Observer代码示例)
浅谈Javascript中的Label语句
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Java垃圾回收器的方法和原理总结
如何在阿里云通过域名搭建网站?
java中使用zxing批量生成二维码立牌
微信小程序 input输入框控件详解及实例(多种示例)
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解

