引言
在我們的大多數項目中,通常會把數據存儲到關系型數據庫中,比如Oracle,SQL Server,Mysql等,但是關系型數據庫對於並發的支持並不是很強大,這樣就會造成系統的性能不佳,
而且存儲的數據多為結構化數據,對於非結構數據(比如文本)和半結構化數據(比如JSon) 就顯得不夠靈活,而非關系型數據庫則很好的彌補了這兩點, 我們通常把讀操作頻繁
的數據寫入Redis中,以Key-value的方式存儲來提高性能。Redis支持5種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
以下介紹了.net中操作redis五種數據類型的基本語法。
一、String(字符串)
1. 簡介
string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 value。
string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數據。比如jpg圖片或者序列化的對象。
string 類型是 Redis 最基本的數據類型,string 類型的值最大能存儲 512MB。
2.使用場景
存儲簡單的鍵值對,比如我們需要統計某個網站的點擊量,關注量、粉絲量等
3. C#使用操作舉例
現在需要保存一個Webservice接口的參數,讓其實現可配置,比如地址、用戶名、密碼、同步時間等信息,我們可以將它在前端頁面格式化為JSon字符串,
然后通過Ajax傳遞到服務端保存到Redis中,代碼如下:
1 /// <summary> 2 /// 保存數據到Redis緩存中 3 /// GHB BY 2020-06-26 4 /// </summary> 5 /// <param name="KeyName">需要保存的鍵名稱,默認保存到redis的第二個數據庫中</param> 6 /// <param name="configInfo">需要保存的配置信息</param> 7 /// <returns>返回保存的結果</returns> 8 public string SaveConfigInfoToRedis(string KeyName, string configInfo) 9 { 10 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 11 { 12 if (client == null) return "保存失敗!"; 13 if (client.ContainsKey(KeyName)) 14 client.Replace<string>(KeyName, configInfo); 15 else 16 client.Set<string>(KeyName, configInfo); 17 return "保存成功!"; 18 } 19 }
保存成功后,我們在redis可視化工具中可以看到我們保存的信息為:
如果下次加載數據的時候,我們可以根據Key來讀取這個string字符串,然后格式化為Hashtable,再序列化為JOSN格式返回到前端,就可以以表單的形式展示,
在表單中可以修改保存等操作,實現了參數的可配置,這讀取代碼如下:
1 /// <summary> 2 /// 從redis緩存中獲取數據,轉化為相應格式后返回 3 /// GHB BY 2020-06-26 4 /// </summary> 5 /// <param name="KeyName">緩存中的鍵名稱</param> 6 /// <returns>輸入鍵對應的值信息</returns> 7 public string LoadConfigFromRedis(string KeyName) 8 { 9 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 10 { 11 if (client == null) return string.Empty; 12 string configData = client.Get<string>(KeyName); 13 if (string.IsNullOrWhiteSpace(configData)) 14 return string.Empty; 15 Hashtable data = JsonConvert.DeserializeObject<Hashtable>(configData); 16 return JsonConvert.SerializeObject(data); 17 18 } 19 }
二、hash(哈希)
1.簡介
Redis hash 是一個鍵值(key=>value)對集合。
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象。
2.使用場景
我們需要靈活的保存一些信息,特別適合保存對象的信息,比如用戶信息、配置信息等
3.C#使用操作舉例
由於我們上面使用string類型的對象保存配置信息存在這樣的問題,就是涉及到序列化和反序列化,如果信息量大的話將降低系統性能,
那么此處我們可以使用Hash數據結構來保存上面的信息,代碼如下:
1 /// <summary> 2 /// 操作redis的hashtable類型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateHash() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb",1)) 8 { 9 Dictionary<string, string> configDic = new Dictionary<string, string>(); 10 configDic.Add("config_IP", "localhost"); 11 configDic.Add("config_Port", "1521"); 12 configDic.Add("config_serviceName", "orcl"); 13 configDic.Add("config_userName", "DE_POWERPMS"); 14 configDic.Add("config_password", "cppepass"); 15 client.SetRangeInHash("config_info", configDic); 16 Dictionary<string, string> testHash = client.GetAllEntriesFromHash("config_info"); 17 foreach (var item in testHash) 18 { 19 Console.WriteLine("Hash的key為:{0} 值為:{1}", item.Key, item.Value); 20 } 21 Console.ReadLine(); 22 } 23 }
使用redis可視化工具我們可以剛才存儲的數據如下:
三、List(列表)
1.簡介
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊),可以使用list的push操作將任務存到List,
然后使用pop操作將任務取出執行,在列表頭部或者末尾操作數據非常高效,不受隊列長度的影響。
列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。
2.使用場景
redis 的 list 數據類型對於大部分使用者來說,是實現隊列服務的最經濟,最簡單的方式。
另外,因為 list 結構的數據查詢兩端附近的數據性能非常好,所以適合一些需要獲取最新數據的場景,比如新聞類應用的 “最近新聞”,獲取錢N個用戶列表等。
3.C#使用操作舉例
對於隊列的使用,在此處比如有多個客戶端需要打印機打印任務,那么使用隊列進行任務的排隊,然后按照排隊順序開始打印
對於棧的使用,比如二叉樹的遍歷,括號的匹配等,我們可以進行先進后出的順序完成,代碼如下:
1 /// <summary> 2 /// 操作redis的List類型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateList() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 8 { 9 #region List隊列操作 10 client.EnqueueItemOnList("QueueList", "打印任務1"); //入隊 11 client.EnqueueItemOnList("QueueList", "打印任務2"); 12 client.EnqueueItemOnList("QueueList", "打印任務3"); 13 client.EnqueueItemOnList("QueueList", "打印任務4"); 14 long q = client.GetListCount("QueueList"); 15 Console.WriteLine("打印任務按照順序打印開始"); 16 for (int i = 0; i < q; i++) 17 { 18 Console.WriteLine("QueueList出隊值:{0}", client.DequeueItemFromList("QueueList")); 19 } 20 Console.WriteLine("打印任務按照順序打印完成"); 21 #endregion 22 #region 棧操作 23 client.PushItemToList("StackList", "入棧操作1"); //入棧 24 client.PushItemToList("StackList", "入棧操作2"); 25 client.PushItemToList("StackList", "入棧操作3"); 26 client.PushItemToList("StackList", "入棧操作4"); 27 Console.WriteLine("開始出棧"); 28 long p = client.GetListCount("StackList"); 29 for (int i = 0; i < p; i++) 30 { 31 Console.WriteLine("StackList出棧值:{0}", client.PopItemFromList("StackList")); 32 } 33 Console.WriteLine("出棧完成"); 34 Console.ReadLine(); 35 #endregion 36 } 37 }
運行結果顯示,隊列是先進先出操作,棧是先進后出操作,並且操作完成后,數據被刪除,如圖所示:
四.Set(集合)
1.簡介
Redis 的 Set 是 string 類型的無序集合。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
集合中最大的成員數為 232 - 1(4294967295, 每個集合可存儲40多億個成員)。
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復的成員。
2.使用場景
集合主要應用在一些需要求交集、並集、補集這樣的場景,比如我們需要求共同好友、共同興趣愛好、共同關注的微博,限制同一個賬號多處登錄系統等場景。
3.C#使用操作舉例
比如現在隨便舉例兩個QQ用戶為例:QQ用戶1和QQ用戶2,他們分別有各自的好友,現在我們可以通過集合來獲取到他們的共同好友,代碼如下:
1 /// <summary> 2 /// 操作redis的Set類型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateSet() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 8 { 9 #region Set操作 10 client.AddItemToSet("QQ用戶1", "好友A"); 11 client.AddItemToSet("QQ用戶1", "好友B"); 12 client.AddItemToSet("QQ用戶1", "好友C"); 13 client.AddItemToSet("QQ用戶1", "好友D"); 14 15 client.AddItemToSet("QQ用戶2", "好友C"); 16 client.AddItemToSet("QQ用戶2", "好友F"); 17 client.AddItemToSet("QQ用戶2", "好友G"); 18 client.AddItemToSet("QQ用戶2", "好友D"); 19 var setunion = client.GetIntersectFromSets("QQ用戶1", "QQ用戶2"); 20 Console.WriteLine("QQ用戶1和QQ用戶2的共同好友為:"); 21 foreach (var item in setunion) 22 { 23 Console.WriteLine(item); 24 } 25 Console.ReadLine(); 26 #endregion 27 } 28 }
運行結果顯示他們的共同好友為: 好友C和好友D
五、zset(sorted set:有序集合)
1.簡介
在 set 的基礎上給集合中每個元素關聯了一個分數,往有序集合中插入數據時會自動根據這個分數排序。不同的是每個元素都會關聯一個double類型的分數。
redis正是通過分數來為集合中的成員進行從小到大的排序。
zset的成員是唯一的,但分數(score)卻可以重復。
2.使用場景
在集合類型的場景上加入排序就是有序集合的應用場景了。比如根據好友的“親密度”排序顯示好友列表。
3.C#使用操作舉例
比如現在有很多主播,每個主播都有粉絲給的禮物,現在需要我們給出禮物數量最多的前三名主播,那么可以使用SortedSet來實現,
可以分別給每個主播定義個分數來存儲禮物數量,代碼如下:
1 /// <summary> 2 /// 操作redis的SortedSet類型 3 /// GHB BY 2020-06-26 4 /// </summary> 5 public static void OperateSortedSet() 6 { 7 using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1)) 8 { 9 #region Set操作 10 client.AddItemToSortedSet("GiftSortedSet", "主播1", 24); 11 client.AddItemToSortedSet("GiftSortedSet", "主播2", 564); 12 client.AddItemToSortedSet("GiftSortedSet", "主播3", 746); 13 client.AddItemToSortedSet("GiftSortedSet", "主播4", 2357); 14 client.IncrementItemInSortedSet("GiftSortedSet", "主播2", new Random().Next(200, 500)); 15 Console.WriteLine("禮物數最多的前三名主播為:"); 16 foreach (var item in client.GetRangeWithScoresFromSortedSet("GiftSortedSet",1,3)) 17 { 18 Console.WriteLine($"名:{item.Key} 分數:{item.Value}"); 19 } 20 Console.ReadLine(); 21 #endregion 22 } 23 }
運行之后,我們可以看到禮物數前三名的主播了,運行結果如下:
總結
以上就是.NET環境下操作Redis五種數據類型的所有方法總結,我們可以看到Redis更是一款數據結構服務器,對於這五種數據類型,我們可以實現很多操作,
比如對字符串進行附加操作;遞增哈希中的值;向列表中增加元素;計算集合的交集、並集與差集;使用排序集合來獲取排名等。
好了,今天的技術分享就到這兒了,如果大家有興趣,可以共同探討,感謝大家的閱讀。
![]() |
作者 | 高紅斌 | |||||
聯系QQ | 2358643757 | ||||||
出處 | https://www.cnblogs.com/gaohongbin | ||||||
本文版權歸作者和博客園共有,如需全部轉載或者部分轉載、摘錄,請在文章明顯位置注明作者和原文鏈接。 |