本系列將和大家分享Redis分布式快取,本章主要簡單介紹下Redis中的Set型別,以及使用Redis解決資料去重、共同好友、可能認識、統計訪問網站的IP數、統計點贊數和隨機獲取某項值等問題,
Set型別:用哈希表來保持字串的唯一性,沒有先后順序,存盤一些集合性的資料,(去重、無序集合)
Set型別最大的特點就是無序、去重,以及交集、差集、并集的使用,
存盤形式:key--List<value>

首先先給大家Show一波Redis中與Set型別相關的API:
using System.Collections.Generic; namespace TianYa.Redis.Service { /// <summary> /// Set:用哈希表來保持字串的唯一性,沒有先后順序,存盤一些集合性的資料,(去重、無序集合、交差并的使用) /// 1、共同好友、可能認識(二度好友) /// 2、利用唯一性,可以統計訪問網站的所有獨立IP /// </summary> public class RedisSetService : RedisBase { #region 添加 /// <summary> /// 往set集合中添加item /// </summary> public void AddItemToSet(string setId, string item) { base._redisClient.AddItemToSet(setId, item); } /// <summary> /// 往set集合中添加list集合 /// </summary> public void AddRangeToSet(string setId, List<string> items) { base._redisClient.AddRangeToSet(setId, items); } #endregion 添加 #region 獲取 /// <summary> /// 隨機獲取set集合中的一個值 /// </summary> public string GetRandomItemFromSet(string setId) { return base._redisClient.GetRandomItemFromSet(setId); } /// <summary> /// 獲取set集合中值的數量 /// </summary> public long GetSetCount(string setId) { return base._redisClient.GetSetCount(setId); } /// <summary> /// 獲取set集合中的所有值 /// </summary> public HashSet<string> GetAllItemsFromSet(string setId) { return base._redisClient.GetAllItemsFromSet(setId); } #endregion 獲取 #region 洗掉 /// <summary> /// 隨機洗掉set集合中的一個值 /// </summary> public string RandomRemoveItemFromSet(string setId) { return base._redisClient.PopItemFromSet(setId); } /// <summary> /// 洗掉set集合中指定的item /// </summary> public void RemoveItemFromSet(string setId, string item) { base._redisClient.RemoveItemFromSet(setId, item); } #endregion 洗掉 #region 其它 /// <summary> /// 從fromSetId集合中移除值為item的值,并把item添加到toSetId集合中 /// </summary> public void MoveBetweenSets(string fromSetId, string toSetId, string item) { base._redisClient.MoveBetweenSets(fromSetId, toSetId, item); } /// <summary> /// 回傳setIds多個集合中的并集 /// </summary> public HashSet<string> GetUnionFromSets(params string[] setIds) { return base._redisClient.GetUnionFromSets(setIds); } /// <summary> /// 回傳setIds多個集合中的交集 /// </summary> public HashSet<string> GetIntersectFromSets(params string[] setIds) { return base._redisClient.GetIntersectFromSets(setIds); } /// <summary> /// 回傳withSetIds多個集合中的差集 /// </summary> /// <param name="fromSetId">原集合</param> /// <param name="withSetIds">其他集合</param> /// <returns>出現在原集合,但不包含在其他集合</returns> public HashSet<string> GetDifferencesFromSet(string fromSetId, params string[] withSetIds) { return base._redisClient.GetDifferencesFromSet(fromSetId, withSetIds); } /// <summary> /// 將setIds多個集合中的并集放入intoSetId集合中 /// </summary> public void StoreUnionFromSets(string intoSetId, string[] setIds) { base._redisClient.StoreUnionFromSets(intoSetId, setIds); } /// <summary> /// 把fromSetId集合中的資料與withSetIds集合中的資料對比,fromSetId集合中不存在withSetIds集合中,則把這些不存在的資料放入intoSetId集合中 /// </summary> public void StoreDifferencesFromSet(string intoSetId, string fromSetId, string[] withSetIds) { base._redisClient.StoreDifferencesFromSet(intoSetId, fromSetId, withSetIds); } #endregion 其它 } }
下面我們就來看下如何使用上面的API來解決一些具體的問題:
一、資料去重
其實,統計訪問網站的IP數、統計點贊數、投票限制以及添加好友申請等這是同一型別的問題,都是去重問題,而我們的Set型別默認就能夠幫我們實作去重,
/// <summary> /// Set:去重、交差并的使用 /// 去重:IP統計去重;添加好友申請;投票限制;點贊; /// </summary> public static void ShowSet() { using (RedisSetService service = new RedisSetService()) { service.FlushAll(); //清理全部資料 //添加后自動去重 service.AddItemToSet("advanced", "111"); service.AddItemToSet("advanced", "112"); service.AddItemToSet("advanced", "114"); service.AddItemToSet("advanced", "114"); service.AddItemToSet("advanced", "115"); service.AddItemToSet("advanced", "115"); service.AddItemToSet("advanced", "113"); var result = service.GetAllItemsFromSet("advanced"); //獲取去重后所有的項 var count = service.GetSetCount("advanced"); //獨立的ip數 var random = service.GetRandomItemFromSet("advanced"); //隨機獲取某一項值 Console.WriteLine($"result:{JsonConvert.SerializeObject(result)}"); Console.WriteLine($"count:{count}"); Console.WriteLine($"random:{random}"); } }
運行結果如下所示:


從運行結果可以看出,往Set集合里面添加資料的時候會自動去重,另外還可以使用GetRandomItemFromSet方法隨機獲取Set集合中的某一項值,
二、交集、差集和并集的使用
using System; using TianYa.Redis.Service; using Newtonsoft.Json; namespace MyRedis.Scene { /// <summary> /// Set型別 /// 好友管理:共同好友,可能認識(二次好友) /// </summary> public class FriendManager { /// <summary> /// Set型別:交集、差集、并集的使用 /// 去重:IP統計去重;添加好友申請;投票限制;點贊; /// </summary> public static void Show() { using (RedisSetService service = new RedisSetService()) { service.FlushAll(); //清理全部資料 //Set1--模擬TianYa的好友 service.AddItemToSet("TianYa", "Jack"); service.AddItemToSet("TianYa", "Mark"); service.AddItemToSet("TianYa", "James"); service.AddItemToSet("TianYa", "James"); service.AddItemToSet("TianYa", "James"); service.AddItemToSet("TianYa", "Bill"); service.AddItemToSet("TianYa", "Linda"); //Set2--模擬Jack的好友 service.AddItemToSet("Jack", "TianYa"); service.AddItemToSet("Jack", "Mark"); service.AddItemToSet("Jack", "Bill"); service.AddItemToSet("Jack", "Brooke"); service.AddItemToSet("Jack", "John"); var result1 = service.GetIntersectFromSets("TianYa", "Jack"); //交集(共同好友) var result2 = service.GetDifferencesFromSet("Jack", "TianYa"); //差集(可能認識) var result3 = service.GetDifferencesFromSet("TianYa", "Jack"); //差集 var result4 = service.GetUnionFromSets("TianYa", "Jack"); //并集 Console.WriteLine($"result1={JsonConvert.SerializeObject(result1)}"); Console.WriteLine($"result2={JsonConvert.SerializeObject(result2)}"); Console.WriteLine($"result3={JsonConvert.SerializeObject(result3)}"); Console.WriteLine($"result4={JsonConvert.SerializeObject(result4)}"); } } } }
運行結果如下所示:



至此本文就全部介紹完了,如果覺得對您有所啟發請記得點個贊哦!!!
Demo原始碼:
鏈接:https://pan.baidu.com/s/1harR09W2Ql6R705BSElZJQ 提取碼:5wr1
此文由博主精心撰寫轉載請保留此原文鏈接:https://www.cnblogs.com/xyh9039/p/13996900.html
著作權宣告:如有雷同純屬巧合,如有侵權請及時聯系本人修改,謝謝!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/224529.html
標籤:.NET技术
上一篇:Redis分布式快取系列(四)- Redis中的Set型別
下一篇:C# 中類的基本概念
