StackExchange.Redis幫助類解決方案RedisRepository封裝(散列Hash類型數據操作)

来源:http://www.cnblogs.com/tdws/archive/2016/08/30/5823935.html
-Advertisement-
Play Games

本文版權歸博客園和作者本人共同所有,轉載和爬蟲請註明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html 上一篇文章的不合理之處,已經有所修改。 今天分享的是Hash散列數據類型操作,不過我也覺得有了前兩篇的基礎搭建後,你就能自己按照StackExch ...


本文版權歸博客園和作者本人共同所有,轉載和爬蟲請註明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html

上一篇文章的不合理之處,已經有所修改。

今天分享的是Hash散列數據類型操作,不過我也覺得有了前兩篇的基礎搭建後,你就能自己按照StackExchange中所封裝的方法,進行調用並再次封裝。在實際項目中,有些方法可能並不需要,比如獲取所有Field以及其Value。當真正封裝成dll的時候,有些方法,我們可以在介面中禁用,在非用不可時,我們可以將其開放。

先上介面代碼吧:如果有朋友希望從頭看起,請進入第一章分享鏈接 http://www.cnblogs.com/tdws/p/5815735.html

 1 #region Redis Hash散列數據類型操作
 2 
 3         /// <summary>
 4         /// Redis散列數據類型  批量新增
 5         /// </summary>
 6         void HashSet(string key, List<HashEntry> hashEntrys, CommandFlags flags = CommandFlags.None);
 7 
 8         /// <summary>
 9         /// Redis散列數據類型  新增一個
10         /// </summary>
11         /// <param name="key"></param>
12         /// <param name="field"></param>
13         /// <param name="val"></param>
14         void HashSet<T>(string key, string field, T val, When when = When.Always, CommandFlags flags = CommandFlags.None);
15 
16         /// <summary>
17         ///  Redis散列數據類型 獲取指定key的指定field
18         /// </summary>
19         /// <param name="key"></param>
20         /// <param name="field"></param>
21         /// <returns></returns>
22         T HashGet<T>(string key, string field);
23 
24         /// <summary>
25         ///  Redis散列數據類型 獲取所有field所有值,以 HashEntry[]形式返回
26         /// </summary>
27         /// <param name="key"></param>
28         /// <param name="flags"></param>
29         /// <returns></returns>
30         HashEntry[] HashGetAll(string key, CommandFlags flags = CommandFlags.None);
31 
32         /// <summary>
33         /// Redis散列數據類型 獲取key中所有field的值。
34         /// </summary>
35         /// <typeparam name="T"></typeparam>
36         /// <param name="key"></param>
37         /// <param name="flags"></param>
38         /// <returns></returns>
39         List<T> HashGetAllValues<T>(string key, CommandFlags flags = CommandFlags.None);
40 
41         /// <summary>
42         /// Redis散列數據類型 獲取所有Key名稱
43         /// </summary>
44         /// <param name="key"></param>
45         /// <param name="flags"></param>
46         /// <returns></returns>
47         string[] HashGetAllKeys(string key, CommandFlags flags = CommandFlags.None);
48 
49         /// <summary>
50         ///  Redis散列數據類型  單個刪除field
51         /// </summary>
52         /// <param name="key"></param>
53         /// <param name="hashField"></param>
54         /// <param name="flags"></param>
55         /// <returns></returns>
56         bool HashDelete(string key, string hashField, CommandFlags flags = CommandFlags.None);
57 
58         /// <summary>
59         ///  Redis散列數據類型  批量刪除field
60         /// </summary>
61         /// <param name="key"></param>
62         /// <param name="hashFields"></param>
63         /// <param name="flags"></param>
64         /// <returns></returns>
65         long HashDelete(string key, string[] hashFields, CommandFlags flags = CommandFlags.None);
66 
67         /// <summary>
68         ///  Redis散列數據類型 判斷指定鍵中是否存在此field
69         /// </summary>
70         /// <param name="key"></param>
71         /// <param name="field"></param>
72         /// <param name="flags"></param>
73         /// <returns></returns>
74         bool HashExists(string key, string field, CommandFlags flags = CommandFlags.None);
75 
76         /// <summary>
77         /// Redis散列數據類型  獲取指定key中field數量
78         /// </summary>
79         /// <param name="key"></param>
80         /// <param name="flags"></param>
81         /// <returns></returns>
82         long HashLength(string key, CommandFlags flags = CommandFlags.None);
83 
84         /// <summary>
85         /// Redis散列數據類型  為key中指定field增加incrVal值
86         /// </summary>
87         /// <param name="key"></param>
88         /// <param name="field"></param>
89         /// <param name="incrVal"></param>
90         /// <param name="flags"></param>
91         /// <returns></returns>
92         double HashIncrement(string key, string field, double incrVal, CommandFlags flags = CommandFlags.None);
93 
94 
95         #endregion

下麵是實現的代碼,其實就是簡單調用下dll為我們提供好的方法。

  1  #region Redis Hash散列數據類型操作
  2         /// <summary>
  3         /// Redis散列數據類型  批量新增
  4         /// </summary>
  5         public void HashSet(string key, List<HashEntry> hashEntrys, CommandFlags flags = CommandFlags.None)
  6         {
  7             _db.HashSet(key, hashEntrys.ToArray(), flags);
  8         }
  9         /// <summary>
 10         /// Redis散列數據類型  新增一個
 11         /// </summary>
 12         /// <param name="key"></param>
 13         /// <param name="field"></param>
 14         /// <param name="val"></param>
 15         public void HashSet<T>(string key, string field, T val, When when = When.Always, CommandFlags flags = CommandFlags.None)
 16         {
 17             _db.HashSet(key, field, SerializeContent(val), when, flags);
 18         }
 19         /// <summary>
 20         ///  Redis散列數據類型 獲取指定key的指定field
 21         /// </summary>
 22         /// <param name="key"></param>
 23         /// <param name="field"></param>
 24         /// <returns></returns>
 25         public T HashGet<T>(string key, string field)
 26         {
 27             return DeserializeContent<T>(_db.HashGet(key, field));
 28         }
 29         /// <summary>
 30         ///  Redis散列數據類型 獲取所有field所有值,以 HashEntry[]形式返回
 31         /// </summary>
 32         /// <param name="key"></param>
 33         /// <param name="flags"></param>
 34         /// <returns></returns>
 35         public HashEntry[] HashGetAll(string key, CommandFlags flags = CommandFlags.None)
 36         {
 37             return _db.HashGetAll(key,flags);
 38         }
 39         /// <summary>
 40         /// Redis散列數據類型 獲取key中所有field的值。
 41         /// </summary>
 42         /// <typeparam name="T"></typeparam>
 43         /// <param name="key"></param>
 44         /// <param name="flags"></param>
 45         /// <returns></returns>
 46         public List<T> HashGetAllValues<T>(string key, CommandFlags flags = CommandFlags.None)
 47         {
 48             List<T> list = new List<T>();
 49             var hashVals = _db.HashValues(key, flags).ToArray();
 50             foreach (var item in hashVals)
 51             {
 52                 list.Add(DeserializeContent<T>(item));
 53             }
 54             return list;
 55         }
 56 
 57         /// <summary>
 58         /// Redis散列數據類型 獲取所有Key名稱
 59         /// </summary>
 60         /// <param name="key"></param>
 61         /// <param name="flags"></param>
 62         /// <returns></returns>
 63         public string[] HashGetAllKeys(string key, CommandFlags flags = CommandFlags.None)
 64         {
 65             return _db.HashKeys(key, flags).ToStringArray();
 66         }
 67         /// <summary>
 68         ///  Redis散列數據類型  單個刪除field
 69         /// </summary>
 70         /// <param name="key"></param>
 71         /// <param name="hashField"></param>
 72         /// <param name="flags"></param>
 73         /// <returns></returns>
 74         public bool HashDelete(string key,string hashField, CommandFlags flags = CommandFlags.None)
 75         {
 76             return _db.HashDelete(key, hashField,flags);
 77         }
 78         /// <summary>
 79         ///  Redis散列數據類型  批量刪除field
 80         /// </summary>
 81         /// <param name="key"></param>
 82         /// <param name="hashFields"></param>
 83         /// <param name="flags"></param>
 84         /// <returns></returns>
 85         public long HashDelete(string key, string[] hashFields, CommandFlags flags = CommandFlags.None)
 86         {
 87             List<RedisValue> list = new List<RedisValue>();
 88             for(int i = 0; i < hashFields.Length; i++)
 89             {
 90                 list.Add(hashFields[i]);
 91             }
 92             return _db.HashDelete(key, list.ToArray(), flags);
 93         }
 94         /// <summary>
 95         ///  Redis散列數據類型 判斷指定鍵中是否存在此field
 96         /// </summary>
 97         /// <param name="key"></param>
 98         /// <param name="field"></param>
 99         /// <param name="flags"></param>
100         /// <returns></returns>
101         public bool HashExists(string key,string field, CommandFlags flags = CommandFlags.None)
102         {
103             return _db.HashExists(key, field, flags);
104         }
105         /// <summary>
106         /// Redis散列數據類型  獲取指定key中field數量
107         /// </summary>
108         /// <param name="key"></param>
109         /// <param name="flags"></param>
110         /// <returns></returns>
111         public long HashLength(string key, CommandFlags flags = CommandFlags.None)
112         {
113             return _db.HashLength(key, flags);
114         }
115         /// <summary>
116         /// Redis散列數據類型  為key中指定field增加incrVal值
117         /// </summary>
118         /// <param name="key"></param>
119         /// <param name="field"></param>
120         /// <param name="incrVal"></param>
121         /// <param name="flags"></param>
122         /// <returns></returns>
123         public double HashIncrement(string key,string field,double incrVal, CommandFlags flags = CommandFlags.None)
124         {
125             return _db.HashIncrement(key, field, incrVal, flags);
126         }
127  #endregion

另外,當你需要批量對Hash中增加數據的時候,如果你增加一個Person對象。他擁有姓名,年齡,性別等屬性,你想將他存在一個三列當中,並將屬性名稱作為field名稱時,你可以使用如下方法。

/// <summary>
        /// 複雜類的對象 轉化為List<HashEntry>  此方法不支持List等對象,需另外封裝
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public List<HashEntry> ObjectToHashEntryList<T>(string key, T obj) where T : class, new()
        {
            var people = new People() { Name = "ws", Age = 18 };
            List<HashEntry> list = new List<HashEntry>();
            foreach (PropertyInfo p in obj.GetType().GetProperties())
            {
                var name = p.Name.ToString();
                var val = p.GetValue(obj);
                list.Add(new HashEntry(name, SerializeContent(val)));
            }
            HashSet(key, list);
            return list;
        }

但是如果你想將一個List<T>存入hash中的話,field名稱還挺不好為你取的。

有了下麵的地方法,你可以通過你傳入的一個方法,這個方法用於根據item定義field名稱。

         /// <summary>
        /// Hash中存儲一個集合
/// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="list"></param> /// <param name="ModelIdentity"></param> public static void HashSet<T>(string key, List<T> list,Func<T, string> ModelIdentity) { List<HashEntry> list = new List<HashEntry>(); foreach (var item in list) { string json = SerializeContent(item); list.Add(new HashEntry(ModelIdentity(item), json)); } db.HashSet(key, list.ToArray()); }

 針對如上兩種方法,獲取hashGet方法也可以跟著改變,需要反序列化成泛型T類型的對象喲。

一直在用別人的RedisHelper, 自己封裝的可能會有些問題,分享出來也真誠歡迎大家來給出指導,我將會進一步改進。

 


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

-Advertisement-
Play Games
更多相關文章
  • 萬事開頭難,尤其是剛接觸Linux的人,會感覺難以入手,如果大家需要的話,我後續會寫文章,從Linux安裝到簡單使用,以step by step的形式貼出來,讓大家少走彎路,增加學習Linux的信心,以後大家開始學習鳥哥的私房菜——基礎文件篇,就事半功倍了。 ...
  • 參考鏈接: http://blog.csdn.net/zydlyq/article/details/50963360 ...
  • 整理Apache+Mysql+PHP+PHPWind(Apache+PHP集成環境) 一、情況簡述: 1、虛擬機VM上面CentOS 2、全部yum安裝(yum安裝與源碼安裝的安裝路徑不同) 二、操作步驟簡述 安裝Apache(httpd) 安裝Mysql(mysqld) 安裝PHP(phpd-fd ...
  • 原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章、作者信息和本聲明,否則將追究法律責任。 最近一直在完善基於Busybox做的ARM Linux的根文件系統,由於busybox是一個精簡的指令集組成的簡單文件系統,其優點就是極精簡,滿足了Linux基本的啟動需求,由於它幾乎沒有什麼後臺服務,對於 ...
  • localhost + 埠可以正常訪問Manager APP,而IP + 埠不能訪問Manager APP,報403錯誤。(我的主機環境是Ubuntu16.04) 前提是你已經配好了tomcat_user.xml,server.xml,context.xml 前提是你已經配好了tomcat_us ...
  • 一、Linux目錄結構 你想知道為什麼某些程式位於/bin下,或者/sbin,或者/usr/bin,或/usr/sbin目錄下嗎?例如,less命令位於/usr/bin目錄下。為什麼沒在/bin中,或/sbin,或/usr/sbin目錄中?所有這些目錄之間有什麼不同? 在這篇文章中,讓我們回顧一下L ...
  • 最終的效果圖 下麵開始幹活:生成幫助文檔 一、創建 WebApi 項目 二、找到 HelpPageConfig.cs 並取消代碼註釋 三、對項目單擊右鍵,選擇屬性,按圖操作 四、啟動項目,輸入Url: localhost:{埠號}/help 【註】Description 沒有顯示內容是因為我們沒有 ...
  • 本次主要分享幾個場景的處理代碼,有更好處理方式多多交流,相互促進進步;代碼由來主要是這幾天使用前端Ace框架做後臺管理系統,這Ace是H5框架裡面的控制項效果挺多的,做相容也很好,有點遺憾是控制項效果基本都是寫一起的,分離起來挺麻煩的;這次主要說的是後端代碼,以後可以分享下這個框架的使用。 以上是個人的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...