澳门金沙vip 2

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

一、问题呈现

 

2.3性能对比:

 

具体代码:

 

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

 

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

 

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

 

三、源码测试案例

澳门金沙vip 1   

具体代码:

 

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

 

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

 

2.1批量写:

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

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

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

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

 

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

 

二、解决问题方法

 

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

 下面给出一些相关的参考文档:

具体的用法是:

 

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

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

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

1.http://www.cnblogs.com/huangxincheng/p/6212406.html

下面给出批量方法:

 

2.2批量读:

具体代码:

前言

 

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

一、问题呈现

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

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

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

具体的用法是:

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

 

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

 

总结

 

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

 

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

 1 public List<StudentEntity> GetBatch(List<int> ids)
 2 {
 3       List<StudentEntity> result = new List<StudentEntity>();
 4       List<Task<StackExchange.Redis.HashEntry[]>> valueList = new List<Task<StackExchange.Redis.HashEntry[]>>();
 5       try
 6       {
 7            var db = RedisCluster.conn.GetDatabase();
 8            var batch = db.CreateBatch();
 9            foreach(int id in ids)
10            {
11                 string key = KeyManager.GetKey(id);
12                 Task<StackExchange.Redis.HashEntry[]> tres = batch.HashGetAllAsync(key);
13                 valueList.Add(tres);
14            }
15            batch.Execute();
16 
17            foreach(var hashEntry in valueList)
18            {
19                var dic = hashEntry.Result.ToDictionary(k => k.Name, v => v.Value);
20                StudentEntity se= new StudentEntity();
21                if (dic.Keys.Contains(StudentEntityRedisHashKey.id.ToString()))
22                {
23                     se.id= FormatUtils.ConvertToInt32(dic[StudentEntityRedisHashKey.id.ToString()], -1);
24                }
25                if (dic.Keys.Contains(StudentEntityRedisHashKey.name.ToString()))
26                {
27                     se.name= dic[StudentEntityRedisHashKey.name.ToString()];
28                }
29                result.Add(se);
30             }
31       }
32       catch (Exception ex)
33       {
34       }
35       return result;
36 }

三、源码测试案例

 

2.http://blog.csdn.net/ma\_jiang/article/details/57085586

 

 

 1         public void TestBatchSent()
 2         {
 3             using (var muxer = Config.GetUnsecuredConnection())
 4             {
 5                 var conn = muxer.GetDatabase(0);
 6                 conn.KeyDeleteAsync("batch");
 7                 conn.StringSetAsync("batch", "batch-sent");
 8                 var tasks = new List<Task>();
 9                 var batch = conn.CreateBatch();
10                 tasks.Add(batch.KeyDeleteAsync("batch"));
11                 tasks.Add(batch.SetAddAsync("batch", "a"));
12                 tasks.Add(batch.SetAddAsync("batch", "b"));
13                 tasks.Add(batch.SetAddAsync("batch", "c"));
14                 batch.Execute();
15                 
16                 var result = conn.SetMembersAsync("batch");
17                 tasks.Add(result);
18                 Task.WhenAll(tasks.ToArray());
19                 
20                 var arr = result.Result;
21                 Array.Sort(arr, (x, y) => string.Compare(x, y));
22                 ...
23             }
24         }

澳门金沙vip 2