国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > Redis > 正文

Redis性能大幅提升之Batch批量讀寫(xiě)詳解

2020-10-28 21:36:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

本文主要介紹的是關(guān)于Redis性能提升之Batch批量讀寫(xiě)的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面來(lái)看看詳細(xì)的介紹:

提示:本文針對(duì)的是StackExchange.Redis

一、問(wèn)題呈現(xiàn)

前段時(shí)間在開(kāi)發(fā)的時(shí)候,遇到了redis批量讀的問(wèn)題,由于在StackExchange.Redis里面我確實(shí)沒(méi)有找到PipeLine命令,找到的是Batch命令,因此對(duì)其用法進(jìn)行了探究一下。

下面的代碼是我之前寫(xiě)的:

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

從上面的代碼中可以看出,并不是批量讀,經(jīng)過(guò)性能測(cè)試,性能確實(shí)是要遠(yuǎn)遠(yuǎn)低于用Batch操作,因?yàn)镠ashGetAll方法被執(zhí)行了多次。

下面給出批量方法:

二、解決問(wèn)題方法

具體的用法是:

var batch = db.CreateBatch();...//這里寫(xiě)具體批量操作的方法batch.Execute();

2.1批量寫(xiě):

具體代碼:

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

這個(gè)方法里執(zhí)行的是批量插入學(xué)生實(shí)體數(shù)據(jù),這里只是針對(duì)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;}

這個(gè)方法是批量讀取學(xué)生實(shí)體數(shù)據(jù),批量拿到實(shí)體數(shù)據(jù)后,將其轉(zhuǎn)化成我們需要的數(shù)據(jù)。下面給出性能對(duì)比。

2.3性能對(duì)比:

10條數(shù)據(jù),約4-5倍差距:

   

1000條數(shù)據(jù),約28倍的差距:

 

隨著數(shù)據(jù)了增多,差距將越來(lái)越大。

三、源碼測(cè)試案例 

上面是批量讀寫(xiě)實(shí)體數(shù)據(jù),下面給出StackExchange.Redis源碼測(cè)試案例里的批量讀寫(xiě)寫(xiě)法:

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

這個(gè)方法里也給出了批量寫(xiě)和讀的操作。

總結(jié)

好了,先說(shuō)到這里了。以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)武林網(wǎng)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 古田县| 剑河县| 杭州市| 罗源县| 文成县| 巨野县| 武乡县| 贵南县| 利辛县| 德令哈市| 北京市| 大安市| 永春县| 慈溪市| 乌拉特中旗| 田林县| 荔波县| 米林县| 江门市| 呼图壁县| 尖扎县| 大庆市| 和平县| 鄂伦春自治旗| 安岳县| 北票市| 犍为县| 普安县| 梓潼县| 岫岩| 安庆市| 沅陵县| 汉源县| 古蔺县| 桑植县| 左权县| 德保县| 金川县| 连南| 德惠市| 大冶市|