本文版權歸博客園和作者本人共同所有,轉載和爬蟲請註明本系列分享地址: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, 自己封裝的可能會有些問題,分享出來也真誠歡迎大家來給出指導,我將會進一步改進。