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

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

相关推荐
wjhx2 分钟前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
一个有梦有戏的人6 分钟前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
YCY^v^6 分钟前
JeecgBoot 项目运行指南
java·学习
人间打气筒(Ada)18 分钟前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd
爬山算法23 分钟前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
自不量力的A同学27 分钟前
Solon AI v3.9 正式发布:全能 Skill 爆发
java·网络·人工智能
万岳科技系统开发38 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
独断万古他化41 分钟前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring
*小海豚*1 小时前
在linux服务器上DNS正常,但是java应用调用第三方解析域名报错
java·linux·服务器
我爱加班、、1 小时前
Websocket能携带token过去后端吗
前端·后端·websocket