怎樣在Redis通過StackExchange.Redis 存儲集合類型List

来源:http://www.cnblogs.com/Mikor/archive/2016/12/26/6223931.html
-Advertisement-
Play Games

StackExchange 是由StackOverFlow出品, 是對Redis的.NET封裝,被越來越多的.NET開發者使用在項目中。 絕大部分原先使用ServiceStack的開發者逐漸都轉了過來,由於SS在其新版中不再開源,並對免費版本有所限制。 實際問題 那麼用.NET的開發者會發現,其根本 ...


StackExchange 是由StackOverFlow出品, 是對Redis的.NET封裝,被越來越多的.NET開發者使用在項目中。
絕大部分原先使用ServiceStack的開發者逐漸都轉了過來,由於SS在其新版中不再開源,並對免費版本有所限制。

實際問題

那麼用.NET的開發者會發現,其根本沒有對List類型的存儲封裝,那麼要實現一個類似如下需求:
假如我有一個Customer的模型。

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address1 { get; set; }
        public string City { get; set; }
        public string State { get; set; }
    }

 

var customers = new List<Customer>();

怎樣將List<customer> customers 存入Redis中呢?

來龍去脈

是由於StackExchange.Redis是一個純客戶端的代理,他僅僅實現了Redis自由的功能,並不額外封裝其它功能。 也不具備像ORM那樣的自動類型匹配。

他僅僅存儲鍵值對 像string 或者 byte[]。所以你明白了吧,必須序列化存儲,用類似Json格式一樣。像用第三方NewtonSoft或者是Google公司流行的Protocol Buffers 序列化格式的Protobuf-Net 也是不錯的選擇。 

Redis支持存儲的類型有五種String ,Hash ,List ,Set ,和 Sorted Set, 正如上面說的,這些存儲類型全部由字元串構成。

其中Set類型是沒有順序的,並且值必須唯一, List類型有順序且允許重覆。

解決方案

如果你僅僅為了緩存存一批量的 List<Customer> 數據, 那麼自己封裝一個ListGet() 和 ListSet()方法吧。

我對比過使用 List 和 String 兩種類型存儲。

Redis 的List類型和 .NET領域還有所不同,實際上,它是一個雙向隊列,可以左右插入值。

所以如果是批量數據插入 那麼必須一個個插入, 代碼比較簡單如下:

//封裝的ListSet
public void ListSet<T>(string key, List<T> value)
{
        .....
       //下麵的database 是redis的資料庫對象.
        foreach (var single in value)
        {
                var s = ConvertJson(single); //序列化
                database.ListRightPush(key, s); //要一個個的插入
        }
}
//封裝的ListGet public void ListGet<T>(string key) { ... //ListRange返回的是一組字元串對象 //需要逐個反序列化成實體 var vList = database.ListRange(key) ; List<T> result = new List<T>(); foreach (var item in vList) { var model = ConvertObj<T>(item); //反序列化 result.Add(model); } return result; }

當然測試了一下性能,取20W條數據平均時間 

測試效果如下:

獲取10000條數據,平均時間大概793.78毫秒.

 

當然也必須試一下String 方式的類型存儲啦,代碼如下:

   /// <summary>
   /// 存儲List
   /// </summary>
   /// <typeparam name="T"></typeparam>
   /// <param name="key"></param>
   /// <param name="value"></param>
   public void ListSet<T>(string key, List<T> value)
   { 
       db.StringSet(key, ConvertJson(value));
   }
   /// <summary>
   /// 獲取指定key的List
   /// </summary>
   /// <param name="key"></param>
   /// <returns></returns>
   public List<T> ListGet<T>(string key)
   { 
       return ConvetList<T>(db.StringGet(key));
   }

哇! 結果驚呆了有沒有。

使用String方式 比List方式快至少20倍。

看來不同的方式性能差別還挺大的。

String是一次性序列化一次性的反序列化,這其中比List少了逐個插入和獲取反序列化的過程。所以作為整體存取還是一個不錯的方式。

至於其餘類型的方式,大家也可以去試試。

 


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

-Advertisement-
Play Games
更多相關文章
  • 年關將近,整個人已經沒有了工作和寫作的激情,估計這個時候很多人跟我差不多,該相親的相親,該聚會喝酒的聚會喝酒,總之就是沒有了幹活的心思(我有很多想法,但就是叫不動我的手腳,所以我只能看著別人在做我想做的事,吃我想吃的東西。)。本人由上個月的每周四五篇,到現在的文章縮短到每周一篇,說個實話,現在的一篇 ...
  • .NET Core和 .NET 4.6中 的C# 6/7 中的編譯器Roslyn 一個重要的特性就是"Compiler as a Service",簡單的講,就是就是將編譯器開放為一種可在代碼中調用的服務, 通常在工作流引擎 或是規則引擎中都需要一項功能是計算表達式,這樣的任務很容易就用Roslyn... ...
  • 當某個請求能夠被成功路由的前提是它滿足某個Route對象設置的路由規則,具體來說,當前請求的URL不僅需要滿足路由模板體現的路徑模式,請求還需要滿足Route對象的所有約束。路由系統採用IRouteConstraint介面來表示路由約束,所以我們在接下來的內容中將路由約束統稱為RouteConstr... ...
  • 上次實現了依賴註入,但是web項目必須要引用業務邏輯層和數據存儲層的實現,項目解耦並不完全;另一方面,要同時註入業務邏輯層和數據訪問層,註入的服務直接寫在Startup中顯得非常臃腫。理想的方式是,web項目近引用介面而不引用實現,在配置文件中進行配置實現程式集合類,註入業務邏輯層而不必註入數據訪問 ...
  • 為了實現這個功能,可算是折騰不少時間,網上搜素出來的結果基本都是如何屏蔽警告對話框。後來請教一個技術大牛(程式員之窗的主要作者Starts_2000),他用C++實現了,他嘗試了下C#也沒有解決,就忙其他的去,大牛時間一般都比較寶貴,後來我就將就用那個C++動態庫,那個時候我測試環境是 win7 6 ...
  • 模型瀏覽器: 在之前的章節中,我們創建了第一個關於學校的實體數據模型。但是EDM設計器並沒有將他所創建的所有對象完全顯示出來。它只將資料庫中的被選擇的表與視圖顯示出來了。 模型瀏覽器可以將EDM所創建的所有對象和函數的信息都顯示出來。右鍵EDM設計器併在菜單中選擇模型瀏覽器即可打開。 模型瀏覽器包含 ...
  • 本次要和大家分享的是webapi的模型驗證,講解的內容可能不單單是做驗證,但都是圍繞模型來說明的;首先來吐槽下,今天下午老闆為自己買了套新辦公傢具,看起來挺好說明老闆有錢,不好的是我們乾技術的又成了搬運工(誰叫技術部男的多呢哈哈),話說讓我們搬點兒什麼小座椅板凳就夠了吧,為什麼4大箱的傢具都讓我們動 ...
  • Navisworks 提供了.NET, COM和NwCreate 三種API。而通常我們說Navisworks API其實指的只是COM或.NET,因為NwCreate的功能比較特殊。待我一一道來: COM API: 這是很早很早以前就提供的介面。COM有多老基本它就有多老了。它能完成大部分產品里有 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...