Spring Boot(二十三):RedisTemplate的Set和Sorted Set类型操作

RedisTemplate和StringRedisTemplate的系列文章详见:

Spring Boot(十七):集成和使用Redis

Spring Boot(十八):RedisTemplate和StringRedisTemplate

Spring Boot(十九):StringRedisTemplate的常用方法和注意事项

Spring Boot(二十):RedisTemplate的序列化

Spring Boot(二十一):RedisTemplate的String和Hash类型操作

Spring Boot(二十二):RedisTemplate的List类型操作

RedisTemplate支持Redis提供的所有数据类型(包括String、Hash、List、Set和Sorted Set等),并提供灵活的配置选项和事务支持,方便开发者与Redis交互。

Set类型操作

Redis中的Set是一个无序的集合,集合中的元素是唯一的,不能重复的,适合去重、集合运算等场景。RedisTemplate对Redis中的Set类型提供了多种操作方法,通过opsForSet(),可以进行Set的增删查等操作。

1、添加元素

opsForSet().add(key, values):向集合中添加一个或多个元素

复制代码
SetOperations<String, String> setOptions = redisTemplate.opsForSet();setOptions.add("mySet", "value1", "value2", "value3");

2、删除元素

opsForSet().remove(key, values):从集合中删除一个或多个元素

复制代码
setOptions.remove("mySet", "value1", "value2");

3、判断元素是否存在

opsForSet().isMember(key, value):检查某个元素是否存在于集合中

复制代码
Boolean exists1 = setOptions.isMember("mySet", "value1");Boolean exists2 = setOptions.isMember("mySet", "value3");

4、获取集合中的所有元素

opsForSet().members(key):获取集合中的所有元素

复制代码
Set<String> members = setOptions.members("mySet");

5、获取集合的大小

opsForSet().size(key):获取集合中元素的数量

复制代码
long size = setOptions.size("mySet");

6、集合运算

复制代码
// 获取两个集合的交集Set<String> intersect = setOptions.intersect("mySet1", "mySet2");// 获取两个集合的并集Set<String> union = setOptions.union("mySet1", "mySet2");// 获取第一个集合中存在,但第二个集合中不存在的元素Set<String> difference = setOptions.difference("mySet1", "mySet2");

Sorted Set类型操作

Sorted Set即有序集合,又叫ZSet。Redis中的Sorted Set是一个有序的集合,集合中的元素是唯一的,并且每个元素都有一个分数(score),按分数排序,适合排行榜、范围查询等场景。RedisTemplate对Redis中的Sorted Set类型提供了多种操作方法,通过opsForZSet(),可以进行Sorted Set的增删查等操作。

1、添加元素

opsForZSet().add(key, value, score):向有序集合中添加一个元素,并为其指定分数

复制代码
ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet();zSetOperations.add("myZSet", "value1", 100);zSetOperations.add("myZSet", "value2", 200);zSetOperations.add("myZSet", "value3", 300);

2、删除元素

opsForZSet().remove(key, values):从有序集合中删除一个或多个元素

复制代码
zSetOperations.remove("myZSet", "value1", "value2");

3、获取元素的分数

opsForZSet().score(key, value):获取指定元素的分数

复制代码
Double score = zSetOperations.score("myZSet", "value3");

4、按索引范围查询

opsForZSet().range(key, start, end):获取有序集合中指定范围内的元素(按分数从小到大排序),包含首尾索引

opsForZSet().reverseRange(key, start, end):获取有序集合中指定范围内的元素(按分数从大到小排序),包含首尾索引

复制代码
// 升序查询(0到-1表示全部)Set<String> ascending = zSetOperations.range("myZSet", 0, -1);// 降序查询Set<String> descending = zSetOperations.reverseRange("myZSet", 0, -1);

5、获取元素的排名

opsForZSet().rank(key, value):获取指定元素在有序集合中的排名(按分数从小到大排序)

opsForZSet().reverseRank(key, value):获取指定元素在有序集合中的排名(按分数从大到小排序)

复制代码
// 升序排名(从0开始)Long rank = zSetOperations.rank("myZSet", "value1");// 降序排名Long reverseRank = zSetOperations.reverseRank("myZSet", "value1");

6、按分数范围获取元素

opsForZSet().rangeByScore(key, min, max):获取指定分数范围内的元素,包含首尾分数

复制代码
Set<String> elementsByScore = zSetOperations.rangeByScore("myZSet", 100, 250);

7、获取有序集合的大小

opsForZSet().zCard(key):获取有序集合中元素的数量

opsForZSet().size(key):获取有序集合中元素的数量

opsForZSet().count(key, min, max):统计分数范围内的元素数量

复制代码
long zCard = zSetOperations.zCard("myZSet");long size = zSetOperations.size("myZSet");long count = zSetOperations.count("myZSet", 100, 250);

8、修改分数

opsForZSet().incrementScore(key, value, addScore):给有序集合key的元素value增加addScore分数

复制代码
// 增加10分zSetOperations.incrementScore("myZSet", "value1", 10);

适用场景

1、Set适合用于需要存储唯一值的场景

1)数据去重

存储唯一性数据,如用户id、ip黑名单等

2)共同关系(交集、并集、差集)

社交网络的共同好友、商品标签的关联性分析等

3)随机元素获取

抽奖活动、随机推荐(如每日推荐商品)

4)分布式锁

在分布式系统中,Set可以用来实现简单的分布式锁,通过add操作的原子性,可以确保只有一个客户端能够获取锁

2、Sorted Set适合用于需要按分数排序的场景

1)排行榜/实时排名

当需要根据某个分数对数据进行排序时,Sorted Set是最佳选择,例如游戏玩家积分榜、热搜排行榜、电商热销商品排行榜等

2)时间轴/延迟队列

当需要按时间戳存储和查询数据时,Sorted Set可以用来实现时间序列数据的存储,如按时间排序的动态(如微博时间轴)、用户的行为日志等

3)范围查询

价格区间筛选商品、按地理位置查询附近的用户

4)优先级队列

当需要按优先级处理任务时(高优先级任务优先处理),Sorted Set可以用来实现优先级队列,分数可以表示任务的优先级

5)分页查询

当需要对大量数据进行分页查询时,Sorted Set可以通过分数范围或排名范围来实现高效的分页

注意事项

1、内存开销

由于需要存储分数,Sorted Set比Set占用更多内存

2、分页查询

Sorted Set的ZRANGE支持分页,适合大数据量场景

3、唯一性

两者均保证元素的唯一性,但Sorted Set的相同元素可以通过不同score覆盖

更多内容,请关注"图南随笔"

相关推荐
say_fall16 小时前
C++ 类与对象易错点:初始化列表顺序 / 静态成员访问 / 隐式类型转换
android·java·开发语言·c++
何中应16 小时前
Redis的两个小错误
数据库·redis·缓存
麦兜*17 小时前
Spring Boot 整合 Apache Doris:实现海量数据实时OLAP分析实战
大数据·spring boot·后端·spring·apache
源代码•宸17 小时前
Golang基础语法(go语言指针、go语言方法、go语言接口、go语言断言)
开发语言·经验分享·后端·golang·接口·指针·方法
Bony-17 小时前
Golang 常用工具
开发语言·后端·golang
pyniu17 小时前
Spring Boot车辆管理系统实战开发
java·spring boot·后端
love_summer17 小时前
深入理解Python控制流:从if-else到结构模式匹配,写出更优雅的条件判断逻辑
后端
虾说羊17 小时前
ssm项目本地部署
java·tomcat