c# 操做Redis的五種基本類型總結

       在咱們的項目中,一般會把數據存儲到關係型數據庫中,好比Oracle,SQL Server,Mysql等,可是關係型數據庫對於併發的支持並非很強大,這樣就會形成系統的性能不佳,並且存儲的數據多爲結構化數據,對於非結構數據(好比文本)和半結構化數據(好比JSon) 就顯得不夠靈活,而非關係型數據庫則很好的彌補了這兩點,  咱們一般把讀操做頻繁的數據寫入Redis中,以Key-value的方式存儲來提升性能。前端

Redis支持5種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。如下介紹了.net中操做redis五種數據類型的基本語法。redis

1、String數據類型的應用場景

1. 簡介

string 是 redis 最基本的類型,你能夠理解成與 Memcached 如出一轍的類型,一個 key 對應一個 value。sql

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格式返回到前端,就能夠以表單的形式展現,dom

在表單中能夠修改保存等操做,實現了參數的可配置,這讀取代碼以下:

 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         }

2、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可視化工具咱們能夠剛纔存儲的數據以下:

3、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

 5、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

相關文章
相關標籤/搜索