溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c#操作Redis的基本類型有哪些

發(fā)布時間:2020-07-07 11:33:45 來源:億速云 閱讀:200 作者:清晨 欄目:開發(fā)技術

小編給大家分享一下c#操作Redis的基本類型有哪些,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

前言

在我們的項目中,通常會把數(shù)據存儲到關系型數(shù)據庫中,比如Oracle,SQL Server,Mysql等,但是關系型數(shù)據庫對于并發(fā)的支持并不是很強大,這樣就會造成系統(tǒng)的性能不佳,而且存儲的數(shù)據多為結構化數(shù)據,對于非結構數(shù)據(比如文本)和半結構化數(shù)據(比如JSon) 就顯得不夠靈活,而非關系型數(shù)據庫則很好的彌補了這兩點, 我們通常把讀操作頻繁的數(shù)據寫入Redis中,以Key-value的方式存儲來提高性能。

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

一、String數(shù)據類型的應用場景

1. 簡介

string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 value。

string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數(shù)據。比如jpg圖片或者序列化的對象。

string 類型是 Redis 最基本的數(shù)據類型,string 類型的值最大能存儲 512MB。

2.使用場景

存儲簡單的鍵值對,比如我們需要統(tǒng)計某個網站的點擊量,關注量、粉絲量等

3. C#使用操作舉例

現(xiàn)在需要保存一個Webservice接口的參數(shù),讓其實現(xiàn)可配置,比如地址、用戶名、密碼、同步時間等信息,我們可以將它在前端頁面格式化為JSon字符串,

然后通過Ajax傳遞到服務端保存到Redis中,代碼如下:

/// <summary>
  /// 保存數(shù)據到Redis緩存中
  /// GHB BY 2020-06-26
  /// </summary>
  /// <param name="KeyName">需要保存的鍵名稱,默認保存到redis的第二個數(shù)據庫中</param>
  /// <param name="configInfo">需要保存的配置信息</param>
  /// <returns>返回保存的結果</returns>
  public string SaveConfigInfoToRedis(string KeyName, string configInfo)
  {
   using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))
   {
    if (client == null) return "保存失敗!";
    if (client.ContainsKey(KeyName))
     client.Replace<string>(KeyName, configInfo);
    else
     client.Set<string>(KeyName, configInfo);
    return "保存成功!";
   }
  }

保存成功后,我們在redis可視化工具中可以看到我們保存的信息為:

c#操作Redis的基本類型有哪些

如果下次加載數(shù)據的時候,我們可以根據Key來讀取這個string字符串,然后格式化為Hashtable,再序列化為JOSN格式返回到前端,就可以以表單的形式展示,

在表單中可以修改保存等操作,實現(xiàn)了參數(shù)的可配置,這讀取代碼如下:

/// <summary>
  /// 從redis緩存中獲取數(shù)據,轉化為相應格式后返回
  /// 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", 6379, "qd*jy*17ghb", 1))
   {
    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#使用操作舉例

由于我們上面使用string類型的對象保存配置信息存在這樣的問題,就是涉及到序列化和反序列化,如果信息量大的話將降低系統(tǒng)性能,

那么此處我們可以使用Hash數(shù)據結構來保存上面的信息,代碼如下:

/// <summary>
  /// 操作redis的hashtable類型
  /// GHB BY 2020-06-26
  /// </summary>
  public static void OperateHash()
  {
   using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb",1))
   {
    Dictionary<string, string> configDic = new Dictionary<string, string>();
    configDic.Add("config_IP", "localhost");
    configDic.Add("config_Port", "1521");
    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可視化工具我們可以剛才存儲的數(shù)據如下:

c#操作Redis的基本類型有哪些

三、List(列表)

1.簡介

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

然后使用pop操作將任務取出執(zhí)行,在列表頭部或者末尾操作數(shù)據非常高效,不受隊列長度的影響。

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

2.使用場景

redis 的 list 數(shù)據類型對于大部分使用者來說,是實現(xiàn)隊列服務的最經濟,最簡單的方式。

另外,因為 list 結構的數(shù)據查詢兩端附近的數(shù)據性能非常好,所以適合一些需要獲取最新數(shù)據的場景,比如新聞類應用的 “最近新聞”,獲取錢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", 6379, "qd*jy*17ghb", 1))
   {
    #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 = 0; 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 = 0; i < p; i++)
    {
     Console.WriteLine("StackList出棧值:{0}", client.PopItemFromList("StackList"));
    }
    Console.WriteLine("出棧完成");
    Console.ReadLine();
    #endregion
   }
  }

運行結果顯示,隊列是先進先出操作,棧是先進后出操作,并且操作完成后,數(shù)據被刪除,如圖所示:

c#操作Redis的基本類型有哪些

四.Set(集合)

1.簡介

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

集合是通過哈希表實現(xiàn)的,所以添加,刪除,查找的復雜度都是 O(1)。

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

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

2.使用場景

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

3.C#使用操作舉例

比如現(xiàn)在隨便舉例兩個QQ用戶為例:QQ用戶1和QQ用戶2,他們分別有各自的好友,現(xiàn)在我們可以通過集合來獲取到他們的共同好友,代碼如下:

/// <summary>
  /// 操作redis的Set類型
  /// GHB BY 2020-06-26
  /// </summary>
  public static void OperateSet()
  {
   using (RedisClient client = new RedisClient("127.0.0.1", 6379, "qd*jy*17ghb", 1))
   {
    #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

c#操作Redis的基本類型有哪些

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

1.簡介

在 set 的基礎上給集合中每個元素關聯(lián)了一個分數(shù),往有序集合中插入數(shù)據時會自動根據這個分數(shù)排序。不同的是每個元素都會關聯(lián)一個double類型的分數(shù)。

redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。

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

2.使用場景

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

3.C#使用操作舉例

比如現(xiàn)在有很多主播,每個主播都有粉絲給的禮物,現(xiàn)在需要我們給出禮物數(shù)量最多的前三名主播,那么可以使用SortedSet來實現(xiàn),

可以分別給每個主播定義個分數(shù)來存儲禮物數(shù)量,代碼如下:

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

運行之后,我們可以看到禮物數(shù)前三名的主播了,運行結果如下:

c#操作Redis的基本類型有哪些

看完了這篇文章,相信你對c#操作Redis的基本類型有哪些有了一定的了解,想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI