SADD myset "apple" "banana" "apple" # 添加元素,重复不存储
SMEMBERS myset # 查看所有元素,结果:1) "apple" 2) "banana"
SISMEMBER myset "apple" # 检查是否存在,返回1(true)
SCARD myset # 集合大小,返回2
SRANDMEMBER myset # 随机取一个元素
Redis Set集合存储实战,解决数据重复与快速检索难题,提升系统性能与数据一致性
在用户签到场景中,使用Set存储用户签到记录,能自动去重,避免重复签到数据占用存储空间。代码示例:
def sign(user_id, date):
key = f"sign:{date}:{user_id}"
if redis.sadd(key, user_id):
print("签到成功")
else:
print("今日已签到")
SINTER set1 set2 # 求交集,找出共同好友
SUNION set1 set2 # 求并集
Redis Set集合存储实战,解决数据重复与快速检索难题,提升系统性能与数据一致性
点赞功能实战:每个帖子一个Set集合存储点赞用户ID。
LPUSH like:123 1001 # 用户1001点赞帖子123
SISMEMBER like:123 1001 # 判断是否已点赞,O(1)时间
SCARD like:123 # 点赞总数
使用Set比List节省90%内存,因为自动去重。
Redis Set集合存储实战,解决数据重复与快速检索难题,提升系统性能与数据一致性
标签系统:用户兴趣标签使用Set存储。
SADD user:1001_tags "java" "redis" "mysql"
用户推荐:SUNION user:1001_tags user:1002_tags
共同兴趣:SINTER user:1001_tags user:1002_tags
Set操作原子性保证数据一致性,无需锁。
Redis Set集合存储实战,解决数据重复与快速检索难题,提升系统性能与数据一致性
防刷接口:记录访问IP Set集合。
SADD block_ips "192.168.1.1"
如果SISMEMBER block_ips ip,返回403。
EXPIRE block_ips 3600 # 1小时后自动清理
解决了频繁查重导致的数据库压力。
Redis Set集合存储实战,解决数据重复与快速检索难题,提升系统性能与数据一致性
SREM myset "apple" # 删除元素
SPOP myset # 随机弹出并删除
SMOVE source dest "member" # 原子移动到另一个Set
这些操作都是O(1)复杂度,性能极高。
FAQ
Q: Set能存多少元素?
A: 单Set最多支持2^32-1个元素,约40亿。
Q: Set有序吗?
A: 无序,需用Sorted Set实现有序。
Q: 如何持久化Set数据?
A: 配置RDB或AOF,定期备份。
Q: Set支持事务吗?
A: 支持MULTI/EXEC事务,所有操作原子执行。