java redis batch_Redis性能大幅提升之Batch批量读写详解

前言

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

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

一、问题呈现

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

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

public List Get(List ids)

{

List result = new List();

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 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 GetBatch(List ids)

{

List result = new List();

List> valueList = new List>();

try

{

var db = RedisCluster.conn.GetDatabase();

var batch = db.CreateBatch();

foreach(int id in ids)

{

string key = KeyManager.GetKey(id);

Task 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倍差距:

214d96f60166d19fc96eb8665f16cb61.png

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

2d34e4429fb80ba30f60b897f09b4d97.png

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

三、源码测试案例

上面是批量读写实体数据,下面给出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();

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));

...

}

}

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

总结

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值