Redis分佈式緩存系列(四)- Redis中的Set類型

本系列將和你們分享Redis分佈式緩存,本章主要簡單介紹下Redis中的Set類型,以及如何使用Redis解決數據去重、共同好友、可能認識、統計訪問網站的IP數、統計點贊數和隨機獲取某項值等問題。html

Set類型:用哈希表來保持字符串的惟一性,沒有前後順序,存儲一些集合性的數據。(去重、無序集合redis

Set類型最大的特色就是無序、去重,以及交集、差集、並集的使用。緩存

存儲形式:key--List<value>dom

首先先給你們Show一波Redis中與Set類型相關的API:分佈式

using System.Collections.Generic;

namespace TianYa.Redis.Service
{
    /// <summary>
    /// Set:用哈希表來保持字符串的惟一性,沒有前後順序,存儲一些集合性的數據。(去重、無序集合、交差並的使用)
    /// 一、共同好友、可能認識(二度好友)
    /// 二、利用惟一性,能夠統計訪問網站的全部獨立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>
        /// <returns>返回刪除的值</returns>
        public string RandomRemoveItemFromSet(string setId)
        {
            return base._redisClient.PopItemFromSet(setId);
        }

        /// <summary>
        /// 隨機刪除set集合中的count個值
        /// </summary>
        /// <returns>返回刪除的值</returns>
        public List<string> RandomRemoveItemsFromSet(string setId, int count)
        {
            return base._redisClient.PopItemsFromSet(setId, count);
        }

        /// <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來解決一些具體的問題:網站

1、數據去重

其實,統計訪問網站的IP數、統計點贊數、投票限制以及添加好友申請等這是同一類型的問題,都是去重問題,而咱們的Set類型默認就可以幫咱們實現去重。spa

/// <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}");
    }
}

運行結果以下所示:code

從運行結果能夠看出,往Set集合裏面添加數據的時候會自動去重。另外還可使用GetRandomItemFromSet方法隨機獲取Set集合中的某一項值htm

2、交集、差集和並集的使用

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)}");
            }
        }
    }
}

運行結果以下所示:blog

至此本文就所有介紹完了,若是以爲對您有所啓發請記得點個贊哦!!!

 

Demo源碼:

連接:https://pan.baidu.com/s/1harR09W2Ql6R705BSElZJQ 
提取碼:5wr1

此文由博主精心撰寫轉載請保留此原文連接:https://www.cnblogs.com/xyh9039/p/13996900.html

相關文章
相關標籤/搜索