-
Redis分布式缓存系列(四)- Redis中的Set类型
本系列将和大家分享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> /// <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来解决一些具体的问题:
一、数据去重
其实,统计访问网站的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/1B_XUM4Eqc81CJdjufOWS9A 提取码:a78n
此文由博主精心撰写转载请保留此原文链接:https://www.cnblogs.com/xyh9039/p/13996900.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式