app使用什么做的网站吗,石家庄建设一个网站多少钱,易点公司,创建网站超市引言
Redis的Set#xff08;集合#xff09;类型是一个无序的、元素不重复的数据结构#xff0c;它基于哈希表实现#xff0c;类似于C中的unordered_set。Set类型在Redis中提供了高效的集合运算能力#xff0c;特别适合处理需要去重、求交并差集的场景。本篇博客将深入探讨…引言Redis的Set集合类型是一个无序的、元素不重复的数据结构它基于哈希表实现类似于C中的unordered_set。Set类型在Redis中提供了高效的集合运算能力特别适合处理需要去重、求交并差集的场景。本篇博客将深入探讨Redis Set的底层原理、核心命令和多种实用场景。一、Redis Set核心特性1.1 基本特性Redis Set特点无序存储元素唯一高效集合运算不保证插入顺序不保证排序顺序自动去重插入重复元素返回0交集sinter并集sunion差集sdiff1.2 与List的对比特性SetList顺序性无序有序插入顺序重复性不允许重复允许重复访问方式不支持下标访问支持下标访问底层实现哈希表、intsetQuickList主要用途去重、集合运算队列、栈、时间线二、Redis Set核心命令详解2.1 基本操作命令SADD - 添加元素# 语法 SADD key member [member ...] # 示例 SADD tags:user:1001 tech music sports # 返回3成功添加的元素个数 # 添加重复元素 SADD tags:user:1001 tech # 返回0元素已存在SMEMBERS - 获取所有元素# 语法 SMEMBERS key # 示例 SMEMBERS tags:user:1001 # 可能返回tech, music, sports顺序不确定 # ⚠️ 警告时间复杂度O(N)大集合需谨慎使用SISMEMBER - 检查元素存在# 语法 SISMEMBER key member # 示例 SISMEMBER tags:user:1001 tech # 返回1存在 SISMEMBER tags:user:1001 art # 返回0不存在SCARD - 获取元素个数# 语法 SCARD key # 示例 SADD tags:user:1001 tech music sports SCARD tags:user:1001 # 返回3 # ⚠️ 时间复杂度O(1)2.2 删除与移动操作SPOP - 随机删除并返回# 语法 SPOP key [count] # 示例 SADD lottery user1 user2 user3 user4 user5 SPOP lottery 2 # 随机删除并返回2个元素 # 可能返回user3, user1SREM - 删除指定元素# 语法 SREM key member [member ...] # 示例 SADD tags:user:1001 tech music sports art SREM tags:user:1001 art music # 删除两个元素 # 返回2成功删除的个数SMOVE - 移动元素# 语法 SMOVE source destination member # 示例 SADD blacklist user:1001 user:1002 SADD whitelist user:1003 # 将user:1001从黑名单移到白名单 SMOVE blacklist whitelist user:1001 # 返回1移动成功2.3 随机操作SRANDMEMBER - 随机获取元素# 语法 SRANDMEMBER key [count] # 示例 SADD colors red green blue yellow purple # 获取1个随机元素 SRANDMEMBER colors # 可能返回green # 获取3个随机元素可能重复 SRANDMEMBER colors 3 # 获取3个不重复的随机元素负数count SRANDMEMBER colors -3三、集合运算命令3.1 交集运算Set A: 1,2,3,4交集运算Set B: 3,4,5,6结果: 3,4SINTER - 计算交集# 语法 SINTER key [key ...] # 示例共同好友 SADD friends:user1 user2 user3 user4 user5 SADD friends:user2 user1 user3 user6 user7 # 计算user1和user2的共同好友 SINTER friends:user1 friends:user2 # 返回user3SINTERSTORE - 计算并存储交集# 语法 SINTERSTORE destination key [key ...] # 示例存储共同好友 SINTERSTORE common:user1:user2 friends:user1 friends:user2 # 返回1交集元素个数 SMEMBERS common:user1:user2 # 返回user33.2 并集运算Set A: 1,2,3,4并集运算Set B: 3,4,5,6结果: 1,2,3,4,5,6SUNION - 计算并集# 语法 SUNION key [key ...] # 示例合并标签 SADD tags:article1 redis database nosql SADD tags:article2 redis cache performance # 合并两篇文章的所有标签 SUNION tags:article1 tags:article2 # 返回redis, database, nosql, cache, performanceSUNIONSTORE - 计算并存储并集# 语法 SUNIONSTORE destination key [key ...] # 示例创建标签池 SUNIONSTORE all:tags tags:article1 tags:article2 SCARD all:tags # 返回53.3 差集运算Set A: 1,2,3,4A - BSet B: 3,4,5,6结果: 1,2Set B: 3,4,5,6B - ASet A: 1,2,3,4结果: 5,6SDIFF - 计算差集# 语法 SDIFF key [key ...] # 示例个性化推荐 SADD user:1001:viewed movie1 movie2 movie3 movie4 SADD all:movies movie1 movie2 movie3 movie4 movie5 movie6 # 推荐用户没看过的电影 SDIFF all:movies user:1001:viewed # 返回movie5, movie6SDIFFSTORE - 计算并存储差集# 语法 SDIFFSTORE destination key [key ...] # 示例创建推荐列表 SDIFFSTORE recommendations:user:1001 all:movies user:1001:viewed SCARD recommendations:user:1001 # 返回2四、Redis Set底层实现4.1 编码方式Redis Set使用两种编码方式根据数据特性自动选择IntSet整数集合# 当集合满足以下条件时使用IntSet # 1. 所有元素都是整数 # 2. 元素数量较少默认512个 # 3. 整数在64位有符号范围内 # 示例使用IntSet SADD small:numbers 1 2 3 4 5 OBJECT ENCODING small:numbers # 返回intsetHashTable哈希表# 当不满足IntSet条件时使用HashTable # 示例使用HashTable SADD large:set string1 string2 100 # 包含非整数 OBJECT ENCODING large:set # 返回hashtable4.2 内存优化配置# Redis配置文件中Set相关参数 set-max-intset-entries 512 # IntSet最大元素数量 # 当元素数量超过此值或包含非整数时转换为HashTable五、Redis Set应用场景5.1 用户标签系统用户标签存储标签: tech,music,sports标签: tech,art,travel标签: music,sports,food标签集合用户1001标签集合用户1002标签集合用户1003基于标签的推荐计算交集找共同兴趣计算差集找互补兴趣计算并集找热门标签实现代码# 为用户添加标签 SADD user:1001:tags tech programming music basketball SADD user:1002:tags tech music travel photography SADD user:1003:tags music sports food travel # 1. 找共同兴趣好友交集 SINTER user:1001:tags user:1002:tags # 返回tech, music → 推荐user1002给user1001 # 2. 找可能感兴趣的新标签差集 SDIFF user:1002:tags user:1001:tags # 返回travel, photography → 推荐给user1001 # 3. 热门标签统计并集 SUNIONSTORE hot:tags user:1001:tags user:1002:tags user:1003:tags5.2 共同好友系统用户1002的好友用户1001的好友SINTERSINTERfriends:user:1002Set元素: user:1001, user:1003, user:1005friends:user:1001Set元素: user:1002, user:1003, user:1004交集运算common:user:1001:user:1002结果Set共同好友: user:1003推荐系统推荐逻辑:1. 共同好友越多推荐权重越高2. 二度人脉推荐3. 兴趣相似度匹配# 存储好友关系 SADD friends:user:1001 user:1002 user:1003 user:1004 user:1005 SADD friends:user:1002 user:1001 user:1003 user:1006 user:1007 # 计算共同好友 SINTER friends:user:1001 friends:user:1002 # 返回user:1003 → 有1个共同好友 # 存储共同好友结果 SINTERSTORE common:user:1001:user:1002 friends:user:1001 friends:user:1002 SCARD common:user:1001:user:1002 # 返回1 # 好友推荐用户可能认识的人 # user:1001的朋友中不是user:1002朋友的人 SDIFF friends:user:1001 friends:user:1002 # 返回user:1002, user:1004, user:1005 # 去掉user:1002自己推荐user:1004和user:1005给user:10025.3 UV统计独立访客Redis Set 存储层访问记录层SADDSADDSADDSADDSCARDSUNIONSTORESUNIONSTORESUNIONSTORESCARDuv:daily:2024-01-15uv:daily:2024-01-16uv:daily:2024-01-17uv:weekly:2024-02uv:monthly:2024-01访问请求1user:1001访问请求2user:1002访问请求3user:1001访问请求4user:1003当日UV: 3user:1001只计1次周UV: 去重统计# 每日UV统计方案 # 1. 记录每日访问用户 SADD uv:2024-01-15 user:1001 user:1002 user:1003 user:1001 # user:1001重复访问但只记录一次 # 2. 获取当日UV SCARD uv:2024-01-15 # 返回3 # 3. 每周UV统计合并7天数据 SUNIONSTORE uv:week:2024-02 uv:2024-01-15 uv:2024-01-16 uv:2024-01-17 SCARD uv:week:2024-02 # 返回去重后的总UV # 4. 按月统计 SUNIONSTORE uv:month:2024-01 uv:2024-01-* # 需要收集所有key六、性能优化与最佳实践6.1 大集合处理策略# 问题SMEMBERS处理大集合会阻塞 # 解决方案1使用SSCAN分批获取 SSCAN large:set 0 COUNT 100 # 分批获取每次100个 # 解决方案2拆分为多个小集合 # 按前缀或哈希分片 SADD set:part:1 item1 item2 SADD set:part:2 item3 item4 # 需要时合并查询6.2 集合运算性能优化# 1. 使用*STORE命令减少网络传输 # 不佳客户端计算 SINTER set1 set2 set3 # 返回大量数据到客户端 # 优化服务器端存储 SINTERSTORE result set1 set2 set3 # 结果存在Redis中 SMEMBERS result # 需要时再获取 # 2. 预估集合大小 SCARD set1 # O(1)操作先了解数据规模 SCARD set2 # 3. 合理排序集合参数 # 差集不满足交换律小集合在前更高效 # set1有10个元素set2有1000个元素 SDIFF set1 set2 # 更高效 SDIFF set2 set1 # 较低效七、总结Redis Set是一个功能强大且高效的数据结构特别适合处理需要去重和集合运算的场景核心优势高效去重自动保证元素唯一性快速查询O(1)时间复杂度的存在性检查丰富运算支持交、并、差集计算内存优化内部实现IntSet或HashTable编码适用场景总结✅用户标签系统基于兴趣的推荐和分组✅社交关系共同好友、好友推荐✅统计分析UV统计、独立计数✅内容筛选多条件过滤、去重✅随机选择抽奖、随机推荐✅访问控制黑白名单管理最佳实践建议避免大集合使用SSCAN代替SMEMBERS合理使用编码尽量使用整数和小集合以启用IntSet优化集合运算小集合在前使用*STORE命令及时清理数据设置合理的过期时间监控性能定期检查大Key和慢查询掌握Redis Set的特性和应用场景能够在实际项目中构建更高效、更灵活的数据处理系统。无论是社交应用、电商系统还是数据分析平台Set都能发挥重要作用。