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覆盖

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

相关推荐
invicinble18 分钟前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟32 分钟前
使用ASM和agent监控属性变化
java
黎雁·泠崖38 分钟前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707532 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.2 小时前
Day06——权限认证-项目集成
java
瑶山2 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy2 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_818732062 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
2501_941982052 小时前
深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?
java·golang·企业微信