最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年06月04日 16:08:34   作者:649727360  
這篇文章主要給大家介紹了關于Redis性能大幅提升之Batch批量讀寫的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來跟著小編一起來學習學習吧。

前言

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

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

一、問題呈現

前段時間在開發(fā)的時候,遇到了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方法被執(zhí)行了多次。

下面給出批量方法:

二、解決問題方法

具體的用法是:

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

這個方法里執(zhí)行的是批量插入學生實體數據,這里只是針對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));
    ...
   }
  }

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

總結

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

相關文章

  • SpringSession+Redis實現集群會話共享的方法

    SpringSession+Redis實現集群會話共享的方法

    為了保證WEB應用的承載能力, 需要對WEB應用進行集群處理.這篇文章主要介紹了SpringSession+Redis實現集群會話共享的方法,需要的朋友參考下吧
    2018-08-08
  • 基于Redis6.2.6版本部署Redis?Cluster集群的問題

    基于Redis6.2.6版本部署Redis?Cluster集群的問題

    這篇文章主要介紹了基于Redis6.2.6版本部署Redis?Cluster集群,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 淺談RedisTemplate和StringRedisTemplate的區(qū)別

    淺談RedisTemplate和StringRedisTemplate的區(qū)別

    本文主要介紹了RedisTemplate和StringRedisTemplate的區(qū)別及個人見解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java實現多級緩存的方法詳解

    Java實現多級緩存的方法詳解

    對于高并發(fā)系統(tǒng)來說,有三個重要的機制來保障其高效運行,它們分別是:緩存、限流和熔斷,所以本文就來和大家探討一下多級緩存的實現方法,希望對大家有所幫助
    2024-02-02
  • Redis實現鎖續(xù)期的項目實踐

    Redis實現鎖續(xù)期的項目實踐

    本文介紹了使用Redis實現分布式鎖的續(xù)期,包括使用Lua腳本、Redlock算法和Redisson客戶端等方法,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • Redis如何使用Pipeline實現批處理操作

    Redis如何使用Pipeline實現批處理操作

    Redis?Pipeline?是一種優(yōu)化?Redis?操作的機制,通過將多個命令打包發(fā)送到?Redis?服務器,減少客戶端與服務器之間的網絡往返時間,本文主要來聊聊Redis如何使用Pipeline實現批處理操作,需要的可以了解下
    2025-02-02
  • 解決redis錯誤消息:BUSYKEY Target key name already exists.問題

    解決redis錯誤消息:BUSYKEY Target key name alre

    這篇文章主要介紹了解決redis錯誤消息:BUSYKEY Target key name already exists.問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Redis緩存工具封裝實現

    Redis緩存工具封裝實現

    本文主要介紹了Redis緩存工具封裝實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • redis分布式鎖之可重入鎖的實現代碼

    redis分布式鎖之可重入鎖的實現代碼

    相信大家都知道可重入鎖的作用防止在同一線程中多次獲取鎖而導致死鎖發(fā)生,本文通過幾個例子給大家分享redis分布式鎖之可重入鎖的實現代碼,對redis分布式鎖的相關知識,感興趣的朋友一起看看吧
    2021-05-05
  • 基于session?Redis實現登錄

    基于session?Redis實現登錄

    這篇文章主要介紹了基于session?Redis實現登錄的相關資料,需要的朋友可以參考下
    2023-10-10

最新評論

古田县| 昌吉市| 昭苏县| 分宜县| 陇南市| 鄂伦春自治旗| 北海市| 阿拉尔市| 泰来县| 佛坪县| 舟曲县| 行唐县| 化州市| 波密县| 邢台市| 若羌县| 云浮市| 绥棱县| 鲁山县| 满洲里市| 托克托县| 东光县| 工布江达县| 乡城县| 理塘县| 牡丹江市| 赤城县| 新巴尔虎右旗| 承德市| 丹巴县| 崇信县| 池州市| 阳信县| 巍山| 巨鹿县| 丹东市| 赫章县| 珲春市| 南城县| 靖边县| 西乌珠穆沁旗|