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

来源:https://www.cnblogs.com/gaohongbin/archive/2020/07/05/13246498.html
-Advertisement-
Play Games

在我們的項目中,通常會把數據存儲到關係型資料庫中,比如Oracle,SQL Server,Mysql等,但是關係型資料庫對於併發的支持並不是很強大,這樣就會造成系統的性能不佳,而且存儲的數據多為結構化數據,對於非結構數據(比如文本)和半結構化數據(比如JSon) 就顯得不夠靈活,而非關係型資料庫則很 ...


       在我們的項目中,通常會把數據存儲到關係型資料庫中,比如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


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

-Advertisement-
Play Games
更多相關文章
  • 在斷斷續續的瞭解c#中,最先想到的就是ASP.NET開發了,在C2中應用也慢慢開始比較廣泛了,比如Covenant,有跨平臺的特性,值得看一看。 ...
  • 基礎概念 Microsoft中間語言(MSIL),也成為通用中間語言(CIL),是一組與平臺無關的指令,由特定於語言的編譯器從源代碼生成。MSIL是獨立於平臺的,因此,他可以在任何公共語言基礎架構支持特定的環境上執行。 通過JIT編譯器將MSIL轉換為特定電腦環境的特定機器代碼。這是在執行MSIL ...
  • 項目背景: 工作之餘兼職一家公司(方向是工業4.0)給做IM系統,主要功能包括:文字、 圖片、文件傳輸、遠程協助、視頻語音等等。這些功能都是基於群會話, 比如工廠操作工人遇到問題,請求遠程專家,這個初級專家不能解決問題,會邀請一個高級專家進來解決。開發過程中主要遇到的問題是視頻和語音這一塊,像其他的... ...
  • 一、前言 回顧:認證授權方案之授權初識 從上一節中,我們在對授權系統已經有了初步的認識和使用,可以發現,asp.net core為我們提供的授權策略是一個非常強大豐富且靈活的認證授權方案,能夠滿足大部分的授權場景。 在ConfigureServices中配置服務:將授權服務添加到容器 public ...
  • 寫在前面 Docker作為開源的應用容器引擎,可以讓我們很輕鬆的構建一個輕量級、易移植的容器,通過Docker方式進行持續交付、測試和部署,都是極為方便的,並且對於我們開發來說,最直觀的優點還是解決了日常開發中的環境配置與部署環境配置上的差異所帶來的種種疑難雜症,從此推脫產品的措辭也少了——“我電腦 ...
  • 什麼鬼,我的CPF快寫好了,你居然也要搞跨平臺UI框架?什麼Maui? 之前怎麼不早說要搞跨平臺UI框架呢?看到谷歌搞flutter眼紅了?明年年底發佈?又搞這種追別人屁股的爛事情。 什麼MVU模式?模仿Dart?用C#代碼直接寫UI的模式和我的CPF很像啊。 當初我考慮過XML,Json來描述UI ...
  • 實現WCF的步驟如下: 設計服務協議 實現服務協議 配置服務 托管服務 生成客戶端(這步可有可無) 設計或定義服務協議要麼使用介面,要麼使用類。建議介面,使用介面好處一堆例如修改介面的實現,但是服務協定有無需改變。 設計服務協議,介面上使用 ServiceContractAttribute ,方法上 ...
  • 這幾天終於弄懂了async和await的模式,也搞明白了一直在心裡面積壓著的許多問題,所以寫一篇博客來和大家分享一下。 關於非同步機制我認為只要記住的以下幾點,就可以弄明白了: 1.我認為async和awwait兩個修飾符中最關鍵的是await,async是由於方法中包含await修飾符之後才在方法定 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...