本文档风哥主要介绍Redis Set类型的去重业务实战,包括Set类型概念、Set操作命令、Set使用场景、Set去重规划、性能考虑、内存优化、基础操作、高级操作、集合操作、过期操作以及实战案例等内容,风哥教程参考Redis官方文档Data types guide等内容编写,适合DBA人员和开发人员在生产环境中使用。
Part01-基础概念与理论知识
1.1 Set类型概念
Redis Set是一个无序的字符串集合,它的特点是元素唯一,不允许重复。Set类型的特点:
- 无序:元素存储顺序与插入顺序无关
- 唯一:不允许存储重复的元素
- 高效:查找、添加、删除操作的时间复杂度都是O(1)
- 存储容量:最多可以存储2^32-1个元素
1.2 Set操作命令
## 1. 基础命令
– SADD:添加元素到集合
– SREM:从集合中删除元素
– SMEMBERS:获取集合所有元素
– SISMEMBER:检查元素是否在集合中
– SCARD:获取集合元素数量
– SRANDMEMBER:随机获取集合中的元素
– SPOP:随机弹出集合中的元素
## 2. 高级命令
– SINTER:求多个集合的交集
– SINTERSTORE:求多个集合的交集并存储到新集合
– SUNION:求多个集合的并集
– SUNIONSTORE:求多个集合的并集并存储到新集合
– SDIFF:求多个集合的差集
– SDIFFSTORE:求多个集合的差集并存储到新集合
– SMOVE:将元素从一个集合移动到另一个集合
## 3. 过期命令
– EXPIRE:设置集合的过期时间
– TTL:查看集合的剩余过期时间
– PERSIST:移除集合的过期时间
1.3 Set使用场景
Set类型的使用场景:
- 去重:存储唯一元素,如用户ID、商品ID等
- 标签管理:存储用户标签、商品标签等
- 交集、并集、差集:实现共同好友、推荐系统等
- 随机数:生成随机元素,如抽奖、随机推荐等
- 在线用户:存储当前在线的用户ID
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 Set去重规划
生产环境Set去重规划:
- 集合命名规范:使用业务前缀+集合类型的方式,如user:unique
- 元素设计:使用唯一标识符作为集合元素,如用户ID、商品ID等
- 集合大小:根据业务需求设计合理的集合大小
- 过期时间:根据数据生命周期设置合理的过期时间
2.2 性能考虑
- 操作性能:添加、删除、查找操作都是O(1)
- 集合操作:交集、并集、差集操作的时间复杂度与集合大小相关
- 内存使用:Set类型的内存使用与元素数量和元素大小相关
- 批量操作:使用批量命令减少网络开销
2.3 内存优化
## 1. 元素优化
– 使用简短的元素值
– 避免存储过大的元素
– 使用唯一标识符作为元素
## 2. 集合大小优化
– 合理控制集合大小
– 对于大集合,考虑分片存储
– 定期清理过期数据
## 3. 命令优化
– 使用SADD批量添加元素
– 避免使用SMEMBERS获取大集合
– 对于大集合的集合操作,考虑使用SINTERSTORE等命令
## 4. 内存淘汰策略
– 根据业务需求选择合适的淘汰策略
– 监控内存使用情况
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 基础操作
## 1. 添加元素到集合
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:unique 1001 1002 1003
# 输出示例
(integer) 3
## 2. 从集合中删除元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 srem user:unique 1003
# 输出示例
(integer) 1
## 3. 获取集合所有元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers user:unique
# 输出示例
1) “1001”
2) “1002”
## 4. 检查元素是否在集合中
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sismember user:unique 1001
# 输出示例
(integer) 1
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sismember user:unique 1003
# 输出示例
(integer) 0
## 5. 获取集合元素数量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 scard user:unique
# 输出示例
(integer) 2
## 6. 随机获取集合中的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 srandmember user:unique
# 输出示例
“1001”
## 7. 随机弹出集合中的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 spop user:unique
# 输出示例
“1002”
## 8. 查看集合剩余元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers user:unique
# 输出示例
1) “1001”
3.2 高级操作
## 1. 将元素从一个集合移动到另一个集合
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd set1 a b c
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd set2 x y z
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smove set1 set2 a
# 输出示例
(integer) 1
## 2. 查看移动后的集合
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers set1
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers set2
# 输出示例
1) “b”
2) “c”
1) “a”
2) “x”
3) “y”
4) “z”
3.3 集合操作
## 1. 求多个集合的交集
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd set1 a b c d
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd set2 c d e f
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sinter set1 set2
# 输出示例
1) “c”
2) “d”
## 2. 求多个集合的交集并存储到新集合
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sinterstore set3 set1 set2
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers set3
# 输出示例
1) “c”
2) “d”
## 3. 求多个集合的并集
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sunion set1 set2
# 输出示例
1) “a”
2) “b”
3) “c”
4) “d”
5) “e”
6) “f”
## 4. 求多个集合的并集并存储到新集合
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sunionstore set4 set1 set2
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers set4
# 输出示例
1) “a”
2) “b”
3) “c”
4) “d”
5) “e”
6) “f”
## 5. 求多个集合的差集
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sdiff set1 set2
# 输出示例
1) “a”
2) “b”
## 6. 求多个集合的差集并存储到新集合
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sdiffstore set5 set1 set2
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers set5
# 输出示例
1) “a”
2) “b”
3.4 过期操作
## 1. 设置集合的过期时间(秒)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd temp:unique 1 2 3
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire temp:unique 300
# 输出示例
(integer) 1
## 2. 查看集合的剩余过期时间(秒)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ttl temp:unique
# 输出示例
(integer) 299
## 3. 移除集合的过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 persist temp:unique
# 输出示例
(integer) 1
风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。
Part04-生产案例与实战讲解
4.1 用户去重
## 1. 存储唯一用户ID
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:registered 1001 1002 1003 1004 1005
# 输出示例
(integer) 5
## 2. 检查用户是否已注册
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sismember user:registered 1001
# 输出示例
(integer) 1
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sismember user:registered 1006
# 输出示例
(integer) 0
## 3. 添加新用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:registered 1006
# 输出示例
(integer) 1
## 4. 获取注册用户数量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 scard user:registered
# 输出示例
(integer) 6
## 5. 移除用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 srem user:registered 1003
# 输出示例
(integer) 1
## 6. 查看剩余注册用户
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers user:registered
# 输出示例
1) “1001”
2) “1002”
3) “1004”
4) “1005”
5) “1006”
4.2 商品去重
## 1. 存储唯一商品ID
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd product:unique 2001 2002 2003 2004 2005
# 输出示例
(integer) 5
## 2. 检查商品是否存在
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sismember product:unique 2001
# 输出示例
(integer) 1
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sismember product:unique 2006
# 输出示例
(integer) 0
## 3. 添加新商品
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd product:unique 2006
# 输出示例
(integer) 1
## 4. 获取商品数量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 scard product:unique
# 输出示例
(integer) 6
## 5. 批量添加商品
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd product:unique 2007 2008 2009
# 输出示例
(integer) 3
## 6. 查看商品列表
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers product:unique
# 输出示例
1) “2001”
2) “2002”
3) “2003”
4) “2004”
5) “2005”
6) “2006”
7) “2007”
8) “2008”
9) “2009”
4.3 事件去重
## 1. 存储唯一事件ID
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd event:processed e1001 e1002 e1003
# 输出示例
(integer) 3
## 2. 检查事件是否已处理
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sismember event:processed e1001
# 输出示例
(integer) 1
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sismember event:processed e1004
# 输出示例
(integer) 0
## 3. 标记事件为已处理
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd event:processed e1004
# 输出示例
(integer) 1
## 4. 设置事件集合过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire event:processed 86400
# 输出示例
(integer) 1
## 5. 查看已处理事件数量
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 scard event:processed
# 输出示例
(integer) 4
4.4 标签管理
## 1. 存储用户标签
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags “技术” “音乐” “旅行”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1002:tags “技术” “电影” “美食”
# 输出示例
(integer) 3
(integer) 3
## 2. 获取用户标签
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 smembers user:1001:tags
# 输出示例
1) “技术”
2) “音乐”
3) “旅行”
## 3. 添加新标签
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sadd user:1001:tags “阅读”
# 输出示例
(integer) 1
## 4. 删除标签
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 srem user:1001:tags “音乐”
# 输出示例
(integer) 1
## 5. 查找共同标签
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sinter user:1001:tags user:1002:tags
# 输出示例
1) “技术”
## 6. 查找差异标签
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 sdiff user:1001:tags user:1002:tags
# 输出示例
1) “旅行”
2) “阅读”
更多学习教程公众号风哥教程itpux_com
Part05-风哥经验总结与分享
5.1 最佳实践
Redis Set去重业务最佳实践:
- 集合命名规范:使用业务前缀+集合类型的方式,如user:unique,学习交流加群风哥微信: itpux-com
- 使用唯一标识符:选择合适的唯一标识符作为集合元素
- 合理设置过期时间:根据数据生命周期设置合适的过期时间
- 批量操作:使用批量命令减少网络开销
- 监控集合大小:避免集合过大导致内存问题
- 使用集合操作:利用交集、并集、差集实现复杂业务逻辑
5.2 常见问题
- 内存使用过高:控制集合大小,定期清理过期数据
- 集合操作性能:对于大集合,考虑使用SINTERSTORE等命令
- 元素重复:Set类型自动去重,无需额外处理
- 过期时间管理:合理设置过期时间,避免缓存雪崩
- 数据一致性:采用合适的更新策略,确保数据一致性
5.3 优化技巧
## 1. 集合设计优化
– 使用简短的集合名称和元素值
– 对于大集合,考虑分片存储
– 合理设计集合的粒度,避免过大或过小
## 2. 操作优化
– 使用SADD批量添加元素
– 避免使用SMEMBERS获取大集合
– 对于大集合的集合操作,使用SINTERSTORE等命令
– 使用管道批量执行操作
## 3. 性能优化
– 监控集合大小,及时处理过大的集合
– 优化集合操作的执行顺序
– 使用多个Set存储不同类型的数据
– 定期清理过期数据
## 4. 内存优化
– 使用合适的元素值,避免存储过大的元素
– 对于临时数据,设置合理的过期时间
– 监控内存使用情况,避免内存溢出
– 选择合适的内存淘汰策略
## 5. 监控优化
– 监控集合大小和内存使用
– 监控集合操作的执行时间
– 设置集合大小告警
– 定期分析集合的使用情况
通过本文档的学习,您应该掌握了Redis Set类型的去重业务实战,能够在生产环境中合理使用Set类型实现用户去重、商品去重、事件去重等功能。在实际应用中,需要根据具体业务场景选择合适的操作命令和集合设计,确保系统的可靠性和性能。
风哥提示:Redis Set类型是实现去重业务的理想选择,它提供了高效的去重功能和丰富的集合操作,适合构建用户去重、商品去重、事件去重等系统。在实际应用中,需要根据业务需求合理设计集合结构和操作策略。
from Redis视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
