1. 程式人生 > 實用技巧 >c# 操作Redis的五種基本型別總結

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

在我們的專案中,通常會把資料儲存到關係型資料庫中,比如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中,程式碼如下:

         /// <summary>
/// 儲存資料到Redis快取中
/// GHB BY 2020-06-26
/// </summary>
/// <param name="KeyName">需要儲存的鍵名稱,預設儲存到redis的第二個資料庫中</param>
/// <param name="configInfo">需要儲存的配置資訊</param>
/// <returns>返回儲存的結果</returns>
public string SaveConfigInfoToRedis(string KeyName, string configInfo)
{
using (RedisClient client = new RedisClient("127.0.0.1", , "qd*jy*17ghb", ))
{
if (client == null) return "儲存失敗!";
if (client.ContainsKey(KeyName))
client.Replace<string>(KeyName, configInfo);
else
client.Set<string>(KeyName, configInfo);
return "儲存成功!";
}
}

儲存成功後,我們在redis視覺化工具中可以看到我們儲存的資訊為:

如果下次載入資料的時候,我們可以根據Key來讀取這個string字串,然後格式化為Hashtable,在序列化為JOSN格式返回到前端,就可以以表單的形式展示,讀取程式碼如下:

         /// <summary>
/// 從redis快取中獲取資料,轉化為相應格式後返回
/// GHB BY 2020-06-26
/// </summary>
/// <param name="KeyName">快取中的鍵名稱</param>
/// <returns>輸入鍵對應的值資訊</returns>
public string LoadConfigFromRedis(string KeyName)
{
using (RedisClient client = new RedisClient("127.0.0.1", , "qd*jy*17ghb", ))
{
if (client == null) return string.Empty;
string configData = client.Get<string>(KeyName);
if (string.IsNullOrWhiteSpace(configData))
return string.Empty;
Hashtable data = JsonConvert.DeserializeObject<Hashtable>(configData);
return JsonConvert.SerializeObject(data); }
}

二、hash(雜湊)

1.簡介

Redis hash 是一個鍵值(key=>value)對集合。

Redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。

2.使用場景

我們需要靈活的儲存一些資訊,特別適合儲存物件的資訊,比如使用者資訊、配置資訊

3.C#使用操作舉例

我們現在還是以上面儲存介面引數為例,將配置資訊儲存到Hashtable中,程式碼如下:

         /// <summary>
/// 操作redis的hashtable型別
/// GHB BY 2020-06-26
/// </summary>
public static void OperateHash()
{
using (RedisClient client = new RedisClient("127.0.0.1", , "qd*jy*17ghb",))
{
Dictionary<string, string> configDic = new Dictionary<string, string>();
configDic.Add("config_IP", "localhost");
configDic.Add("config_Port", "");
configDic.Add("config_serviceName", "orcl");
configDic.Add("config_userName", "DE_POWERPMS");
configDic.Add("config_password", "cppepass");
client.SetRangeInHash("config_info", configDic);
Dictionary<string, string> testHash = client.GetAllEntriesFromHash("config_info");
foreach (var item in testHash)
{
Console.WriteLine("Hash的key為:{0} 值為:{1}", item.Key, item.Value);
}
Console.ReadLine();
}
}

使用redis視覺化工具我們可以剛才儲存的資料如下:

三、List(列表)

1.簡介

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊),可以使用list的push操作將任務存到List,

然後使用pop操作將任務取出執行,在列表頭部或者末尾操作資料非常高效,不受佇列長度的影響。

列表最多可儲存 232- 1 元素 (4294967295, 每個列表可儲存40多億)。

2.使用場景

redis 的 list 資料型別對於大部分使用者來說,是實現佇列服務的最經濟,最簡單的方式。

另外,因為 list 結構的資料查詢兩端附近的資料效能非常好,所以適合一些需要獲取最新資料的場景,比如新聞類應用的 “最近新聞”,獲取錢N個使用者列表等。

3.C#使用操作舉例

對於佇列的使用,在此處比如有多個客戶端需要印表機列印任務,那麼使用佇列進行任務的排隊,然後按照排隊順序開始列印

對於棧的使用,比如二叉樹的遍歷,括號的匹配等,我們可以進行先進後出的順序完成,程式碼如下:

         /// <summary>
/// 操作redis的List型別
/// GHB BY 2020-06-26
/// </summary>
public static void OperateList()
{
using (RedisClient client = new RedisClient("127.0.0.1", , "qd*jy*17ghb", ))
{
#region List佇列操作
client.EnqueueItemOnList("QueueList", "列印任務1"); //入隊
client.EnqueueItemOnList("QueueList", "列印任務2");
client.EnqueueItemOnList("QueueList", "列印任務3");
client.EnqueueItemOnList("QueueList", "列印任務4");
long q = client.GetListCount("QueueList");
Console.WriteLine("列印任務按照順序列印開始");
for (int i = ; i < q; i++)
{
Console.WriteLine("QueueList出隊值:{0}", client.DequeueItemFromList("QueueList"));
}
Console.WriteLine("列印任務按照順序列印完成");
#endregion
#region 棧操作
client.PushItemToList("StackList", "入棧操作1"); //入棧
client.PushItemToList("StackList", "入棧操作2");
client.PushItemToList("StackList", "入棧操作3");
client.PushItemToList("StackList", "入棧操作4");
Console.WriteLine("開始出棧");
long p = client.GetListCount("StackList");
for (int i = ; i < p; i++)
{
Console.WriteLine("StackList出棧值:{0}", client.PopItemFromList("StackList"));
}
Console.WriteLine("出棧完成");
Console.ReadLine();
#endregion
}
}

四.Set(集合)

1.簡介

Redis 的 Set 是 string 型別的無序集合。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 O(1)。

集合中最大的成員數為 232- 1(4294967295, 每個集合可儲存40多億個成員)。

Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。

2.使用場景

集合主要應用在一些需要求交集、並集、補集這樣的場景,比如我們需要求共同好友、共同興趣愛好、共同關注的微博,限制同一個賬號多處登入系統等。

3.C#使用操作舉例

比如現在隨便舉例兩個QQ使用者為例:QQ使用者1和QQ使用者2,他們分別有各自的好友,現在我們可以通過集合來獲取到他們的共同好友,程式碼如下:

         /// <summary>
/// 操作redis的Set型別
/// GHB BY 2020-06-26
/// </summary>
public static void OperateSet()
{
using (RedisClient client = new RedisClient("127.0.0.1", , "qd*jy*17ghb", ))
{
#region Set操作
client.AddItemToSet("QQ使用者1", "好友A");
client.AddItemToSet("QQ使用者1", "好友B");
client.AddItemToSet("QQ使用者1", "好友C");
client.AddItemToSet("QQ使用者1", "好友D"); client.AddItemToSet("QQ使用者2", "好友C");
client.AddItemToSet("QQ使用者2", "好友F");
client.AddItemToSet("QQ使用者2", "好友G");
client.AddItemToSet("QQ使用者2", "好友D");
var setunion = client.GetIntersectFromSets("QQ使用者1", "QQ使用者2");
Console.WriteLine("QQ使用者1和QQ使用者2的共同好友為:");
foreach (var item in setunion)
{
Console.WriteLine(item);
}
Console.ReadLine();
#endregion
}
}

執行結果顯示他們的共同好友為: 好友C和好友D

五、zset(sorted set:有序集合)

1.簡介

在 set 的基礎上給集合中每個元素關聯了一個分數,往有序集合中插入資料時會自動根據這個分數排序。不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

2.使用場景

在集合型別的場景上加入排序就是有序集合的應用場景了。比如根據好友的“親密度”排序顯示好友列表。

3.C#使用操作舉例

比如現在有很多主播,每個主播都有粉絲給的禮物,現在需要我們給出禮物數量最多的前三名主播,那麼可以使用SortedSet來實現,可以分別給每個主播定義個分數來儲存禮物數量,程式碼如下:

         /// <summary>
/// 操作redis的SortedSet型別
/// GHB BY 2020-06-26
/// </summary>
public static void OperateSortedSet()
{
using (RedisClient client = new RedisClient("127.0.0.1", , "qd*jy*17ghb", ))
{
#region Set操作
client.AddItemToSortedSet("GiftSortedSet", "主播1", );
client.AddItemToSortedSet("GiftSortedSet", "主播2", );
client.AddItemToSortedSet("GiftSortedSet", "主播3", );
client.AddItemToSortedSet("GiftSortedSet", "主播4", );
client.IncrementItemInSortedSet("GiftSortedSet", "主播2", new Random().Next(, ));
Console.WriteLine("禮物數最多的前三名主播為:");
foreach (var item in client.GetRangeWithScoresFromSortedSet("GiftSortedSet",,))
{
Console.WriteLine($"名:{item.Key} 分數:{item.Value}");
}
Console.ReadLine();
#endregion
}
}

執行之後,我們可以看到禮物數前三名的主播了,執行結果如下:

好了,今天的技術分享就到這兒了,如果大家有興趣,可以共同探討,QQ:2358643757