文章目录
- ⛄ 概述
- ⛄ Set类型的常见命令
- ⛄RedisTemplate API
- ❄️❄️ 添加Set缓存(值可以是一个,也可是多个)
- ❄️❄️设置过期时间(单独设置)
- ❄️❄️根据key获取Set中的所有值
- ❄️❄️根据value从一个set中查询,是否存在
- ❄️❄️获取Set缓存的长度
- ❄️❄️移除指定的元素
- ❄️❄️移除指定的key
- ❄️❄️ 交集 并集 差集
- ⛄使用场景
⛄ 概述
Redis
的Set
结构与Java中的HashSet
类似,可以看做是一个value为null的HashMap
。因为也是一个hash表,因此具备与HashSet
类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集.并集.差集等功能
⛄ Set类型的常见命令
- SADD key member … :向set中添加一个或多个元素
- SREM key member … : 移除set中的指定元素
- SCARD key: 返回set中元素的个数
- SISMEMBER key member:判断一个元素是否存在于set中
- SMEMBERS:获取set中的所有元素
- SINTER key1 key2 … :求key1与key2的交集
- SDIFF key1 key2 … :求key1与key2的差集
- SUNION key1 key2 …:求key1和key2的并集
⛄RedisTemplate API
❄️❄️ 添加Set缓存(值可以是一个,也可是多个)
//1、通过redisTemplate设置值
redisTemplate.boundSetOps("setKey").add("setValue1", "setValue2", "setValue3");
//2、通过BoundValueOperations设置值
BoundSetOperations setKey = redisTemplate.boundSetOps("setKey");
setKey.add("setValue1", "setValue2", "setValue3");
//3、通过ValueOperations设置值
SetOperations setOps = redisTemplate.opsForSet();
setOps.add("setKey", "SetValue1", "setValue2", "setValue3");
❄️❄️设置过期时间(单独设置)
redisTemplate.boundValueOps("setKey").expire(1,TimeUnit.MINUTES);
redisTemplate.expire("setKey",1,TimeUnit.MINUTES);
❄️❄️根据key获取Set中的所有值
//1、通过redisTemplate获取值
Set set1 = redisTemplate.boundSetOps("setKey").members();
//2、通过BoundValueOperations获取值
BoundSetOperations setKey = redisTemplate.boundSetOps("setKey");
Set set2 = setKey.members();
//3、通过ValueOperations获取值
SetOperations setOps = redisTemplate.opsForSet();
Set set3 = setOps.members("setKey");
❄️❄️根据value从一个set中查询,是否存在
Boolean isEmpty = redisTemplate.boundSetOps("setKey").isMember("setValue2");
❄️❄️获取Set缓存的长度
Long size = redisTemplate.boundSetOps("setKey").size();
❄️❄️移除指定的元素
Long result1 = redisTemplate.boundSetOps("setKey").remove("setValue1");
❄️❄️移除指定的key
Boolean result2 = redisTemplate.delete("setKey");
❄️❄️ 交集 并集 差集
// 交集 返回存储在 “key1” 和 “key2” 中的集合的交集。
Set<Object> intersect = redisTemplate.opsForSet().intersect("key1", "key2");
// 并集 返回存储在 “key1” 和 “key2” 中的集合的并集。
Set<Object> union = redisTemplate.opsForSet().union("key1", "key2");
// 差集 返回存储在 “key1” 中但不在 “key2” 中的集合,即差集。
Set<Object> difference = redisTemplate.opsForSet().difference("key1", "key2");
⛄使用场景
-
标签系统(Tagging System): Set 可以用来实现标签系统,你可以将每个对象的标签存储在一个 Set 中,以便于快速查找某个标签下的所有对象。
-
共同好友(Common Friends): 在社交网络应用中,可以使用 Set 来存储用户的好友列表,通过交集操作可以快速计算两个用户的共同好友。
-
去重(Deduplication): Set 的特性是存储唯一的元素,因此可以用来对数据进行去重,保证数据的唯一性。
-
集合运算(Set Operations): Redis 提供了丰富的集合操作,比如并集、交集、差集等,这些操作可以用来对多个集合进行操作,从而实现各种复杂的需求,比如统计两个集合的不同元素、查找两个集合的交集等。
-
实时在线用户列表(Real-time Online Users): 在实时应用中,可以使用 Set 来存储在线用户的 ID,通过添加和删除操作来维护在线用户列表。
-
IP 或用户限流(Rate Limiting): 可以使用 Set 来实现 IP 或用户的限流,每次请求到达时,将请求的 IP 或用户 ID 添加到 Set 中,并设置过期时间,当 Set 中的元素超过限定数量时,就拒绝新的请求。