RedisTemplate和StringRedisTemplate的系列文章详见:
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覆盖
更多内容,请关注"图南随笔"