## set 数据类型介绍
Redis中的set类型是一组无序的字符串值。
set通过其独特的数据结构和丰富的命令提供了在存储和处理集合元素方面的一些非常有用的功能。下面列出了主要的set类型命令:
- SADD key member1 [member2]:向指定键名的集合中添加一个或多个成员,并返回成功添加的成员数量。
- SREM key member1 [member2]:从指定键名的集合中移除一个或多个成员,并返回成功移除的成员数量。
- SMEMBERS key:返回指定键名集合中所有的成员。
- SISMEMBER key member:检查指定成员是否在集合中,存在返回1,不存在则返回0。
- SRANDMEMBER key [count]:随机获取指定键名集合中的一个或多个成员。如果指定count参数,则表示获取不重复的count个随机成员。
- SCARD key:获取指定键名集合中的成员数。
- SPOP key [count]:随机弹出指定键名集合中的一个或多个成员。如果指定count参数,则表示弹出不重复的count个随机成员。
- SDIFF key1 [key2]:对两个或多个集合执行差集操作,返回结果集中保存的成员。
- SUNION key1 [key2]:对两个或多个集合执行并集操作,返回结果集中保存的成员。
- SINTER key1 [key2]:对两个或多个集合执行交集操作,返回结果集中保存的成员。
- SDIFFSTORE destination_key key1 [key2]:对两个或多个集合执行差集操作,并将结果保存到指定键名的集合中。
- SUNIONSTORE destination_key key1 [key2]:对两个或多个集合执行并集操作,并将结果保存到指定键名的集合中。
- SINTERSTORE destination_key key1 [key2]:对两个或多个集合执行交集操作,并将结果保存到指定键名的集合中。
set类型提供了非常丰富的命令来管理集合中的元素,使其在实际应用场景中有很大的灵活性和适用性。
不排序实现
场景:一件商品 同一个用户只能点赞一次
使用 Redis 的 set(唯一 & 不排序) 数据结构
// 判断当前登录用户是否已经点赞 String key = BLOG_LIKED_KEY + id; Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, userId.toString()); // 保存用户到Redis的set集合 stringRedisTemplate.opsForSet().add(key, userId.toString()); // 把用户从Redis的set集合移除 stringRedisTemplate.opsForSet().remove(key, userId.toString());
排序实现
场景:一件商品 同一个用户只能点赞一次 且 按照点赞时间排序
使用 Redis 的 sortedSet(唯一 & 排序) 数据结构
// 保存用户到Redis的sortedSet集合 zadd key value score stringRedisTemplate.opsForZSet().add(key, userId.toString(), System.currentTimeMillis()); // 获取当前登录用户是否已经点赞(null 未点赞) String key = BLOG_LIKED_KEY + id; Double score = stringRedisTemplate.opsForZSet().score(key, userId.toString()); // 把用户从Redis的set集合移除 key value stringRedisTemplate.opsForZSet().remove(key, userId.toString()); // 查询top5的点赞用户 zrange key 0 4 (范围查询) Set<String> top5 = stringRedisTemplate.opsForZSet().range(key, 0, 4);