一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - Redis性能大幅提升之Batch批量讀寫詳解

Redis性能大幅提升之Batch批量讀寫詳解

2019-11-06 12:41649727360 Redis

這篇文章主要給大家介紹了關于Redis性能大幅提升之Batch批量讀寫的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來跟著小編一起來學習學習吧。

前言

本文主要介紹的是關于Redis性能提升之Batch批量讀寫的相關內容,分享出來供大家參考學習,下面來看看詳細的介紹:

提示:本文針對的是StackExchange.Redis

一、問題呈現

前段時間在開發的時候,遇到了redis批量讀的問題,由于在StackExchange.Redis里面我確實沒有找到PipeLine命令,找到的是Batch命令,因此對其用法進行了探究一下。

下面的代碼是我之前寫的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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方法被執行了多次。

下面給出批量方法:

二、解決問題方法

具體的用法是:

?
1
2
3
4
5
var batch = db.CreateBatch();
 
...//這里寫具體批量操作的方法
 
batch.Execute();

2.1批量寫:

具體代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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批量讀:

具體代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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倍差距:

Redis性能大幅提升之Batch批量讀寫詳解   

1000條數據,約28倍的差距:

Redis性能大幅提升之Batch批量讀寫詳解

隨著數據了增多,差距將越來越大。

三、源碼測試案例

上面是批量讀寫實體數據,下面給出StackExchange.Redis源碼測試案例里的批量讀寫寫法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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));
    ...
   }
  }

這個方法里也給出了批量寫和讀的操作。

總結

好了,先說到這里了。以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

延伸 · 閱讀

精彩推薦
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
主站蜘蛛池模板: 亚洲激情一区 | 91精品综合 | 国产精品合集一区二区 | 精品亚洲永久免费精品 | 97社区| 日本一二线不卡在线观看 | 欧美日韩中文字幕在线视频 | 乌克兰18sex性hd | 偷拍综合网| 暖暖暖免费观看在线观看 | 欧美另类69xxx| 免费在线观看成年人视频 | 果冻传媒和91制片厂网站软件 | 国产精品久久久精品日日 | 国产精品www视频免费看 | 国产成人久久久精品一区二区三区 | 天天久久综合 | 色综合综合 | 国产成人免费高清激情视频 | 久久久这里有精品999 | 成人伊人亚洲人综合网站222 | 日韩欧美成末人一区二区三区 | 国产亚洲精品激情一区二区三区 | 五月天精品视频在线观看 | 91庥豆果冻天美精东蜜桃传媒 | 特a级片| 亚洲区精品久久一区二区三区 | 成年人黄视频在线观看 | 亚裔aⅴ艳星katsuni | 26uuu成人人网图片 | 亚洲色图综合网 | 韩国久久 | 国内自拍成人网在线视频 | 狠狠燥 | 久久国产精品福利影集 | 午夜香蕉成视频人网站高清版 | 日本性生活免费看 | 精品人伦一区二区三区潘金莲 | 青草视频久久 | 久久久无码精品亚洲A片软件 | 国产欧美精品一区二区三区四区 |