主頁 > .NET開發 > c# 操作Redis的五種基本型別總結

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

2020-09-11 17:16:16 .NET開發

引言

在我們的大多數專案中,通常會把資料存盤到關系型資料庫中,比如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 = https://www.cnblogs.com/gaohongbin/p/client.Get<string>(KeyName);
13                 if (string.IsNullOrWhiteSpace(configData))
14                     return string.Empty;
15                 Hashtable data = https://www.cnblogs.com/gaohongbin/p/JsonConvert.DeserializeObject(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
本文著作權歸作者和博客園共有,如需全部轉載或者部分轉載、摘錄,請在文章明顯位置注明作者和原文鏈接,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/6408.html

標籤:C#

上一篇:C#7.0新特性

下一篇:async和await之我見

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more