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

来源:http://www.cnblogs.com/zhangtingzu/archive/2017/06/04/6939895.html
-Advertisement-
Play Games

Redis大幅性能提升之Batch批量讀寫 提示:本文針對的是StackExchange.Redis 一、問題呈現 前段時間在開發的時候,遇到了redis批量讀的問題,由於在StackExchange.Redis裡面我確實沒有找到PipeLine命令,找到的是Batch命令,因此對其用法進行了探究一 ...


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

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

 

一、問題呈現

 

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

 

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

 

 1 public List<StudentEntity> Get(List<int> ids)
 2 {
 3       List<StudentEntity> result = new List<StudentEntity>();
 4       try
 5       {
 6           var db = RedisCluster.conn.GetDatabase();
 7           foreach (int id in ids.Keys)
 8           {
 9               string key = KeyManager.GetKey(id);
10               var dic = db.HashGetAll(key).ToDictionary(k => k.Name, v => v.Value);
11               StudentEntity se = new StudentEntity();
12               if (dic.Keys.Contains(StudentEntityRedisHashKey.id.ToString()))
13               {
14                   pe.id = FormatUtils.ConvertToInt32(dic[StudentEntityRedisHashKey.id.ToString()], -1);
15               }
16               if (dic.Keys.Contains(StudentEntityRedisHashKey.name.ToString()))
17               {
18                   pe.name= dic[StudentEntityRedisHashKey.name.ToString()];
19               }
20               result.Add(se);
21          }
22             catch (Exception ex)
23             {
24             }
25             return result;
26 }

 

從上面的代碼中可以看出,並不是批量讀,經過性能測試,性能確實是要遠遠低於用Batch操作,因為HashGetAll方法被執行了多次

 

下麵給出批量方法:

 

二、解決問題方法

 

具體的用法是:

 

var batch = db.CreateBatch();

 

...//這裡寫具體批量操作的方法

 

batch.Execute();

 

 

2.1批量寫

 

具體代碼:

 

 

 1 public bool InsertBatch(List<StudentEntity> seList)
 2 {
 3       bool result = false;
 4       try
 5       {
 6            var db = RedisCluster.conn.GetDatabase();
 7            var batch = db.CreateBatch();
 8            foreach (var se in seList)
 9            {
10                 string key = KeyManager.GetKey(se.id);
11                 batch.HashSetAsync(key, StudentEntityRedisHashKey.id.ToString(), te.id);
12                 batch.HashSetAsync(key, StudentEntityRedisHashKey.name.ToString(), te.name);
13            }
14            batch.Execute();
15            result = true;
16       }
17       catch (Exception ex)
18       {
19       }
20       return result;
21 }

 

這個方法里執行的是批量插入學生實體數據,這裡只是針對Hash,其它的也一樣操作。

 

2.2批量讀

 

具體代碼:

 

 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.3性能對比

10條數據,約4-5倍差距:

   

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

 

 

 

 

 

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

 

 

三、源碼測試案例

 

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

 

 

 

 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         }

 

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

好了,先說到這裡了。

查看原文:http://www.cnblogs.com/zhangtingzu/

 

 下麵給出一些相關的參考文檔:

 

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

 

2.http://blog.csdn.net/ma_jiang/article/details/57085586

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android之自定義View學習(一) Canvas常用方法: 圖片來源 github地址:https://github.com/SiberiaDante/DrawView ...
  • <ion-slide-box>屬性中迴圈播放:dose-continue=‘true’,但是在項目遇到這樣一個問題,從後臺獲取數據後將數據ng-repeat到<ion-slide>中,發現迴圈播放失效了,後來在外網中找到了一個解決方法。 $ionicSlideBoxDelegate.update() ...
  • 1.概述 Android4.4以上開始使用ART虛擬機,在此之前我們一直使用的Dalvik虛擬機,那麼為什麼Google突然換了Android運行的虛擬機呢?答案只有一個:ART虛擬機更優秀。 2.Dalvik vs ARTDalvik Android4.4及以前使用的都是Dalvik虛擬機,我們知 ...
  • xUtils3使用詳解 一、xUtils簡介: xUtils是基於Afinal開發的目前功能比較完善的一個Android開源框架,官網:https://github.com/wyouflf/xUtils3 xUtils 包含了orm, http(s), image, view註解, 但依然很輕量級( ...
  • 問題描述:開啟SQLServer自動備份後,備份文件越來越多,有沒有及時清理,導致伺服器空間不足,備份出錯,以至於出現幾個G的ErrorLog文件,影響系統的登錄管理。 解決辦法:定期清理SQLServer ErrorLog文件。 ...
  • 開啟MySQL的基本語法是grant授權,這個一般都沒有什麼問題,主要是開啟之後可能還是連接不上 可能會出現如下的錯誤提示 確認成功授權之後(具體查看方法在文底),出現如下的問題可能有兩種原因,一種是防火牆問題,一種是MySQL配置綁定了本地127.0.0.1。 一、防火牆問題 防火牆沒有開啟330 ...
  • 1、DDL-增刪改查 (1)SELECT - 獲取數據(SELECT * FROM 表名 WHERE 條件)(2)UPDATE - 更新數據(UPDATE 表名 SET (欄位名=值,欄位名=值) WHERE 條件)(3)DELETE - 刪除數據(DELETE FROM 表名 WHERE 條件)( ...
  • 4月份參加騰訊的實習生面試,初試和覆試的時候都被問到資料庫索引的知識,所以很有必要整理一下這方面的知識。 分為三點,為什麼要用資料庫索引,換句話說它的優點有哪些;什麼情況下適合用資料庫索引呢?怎麼創建資料庫索引,索引有哪些特征呢? (一)為什麼要用資料庫索引? (資料庫索引有哪些優點) ——因為,創 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...