乐趣区

SpringBoot之RedisTemplate ZSet数据结构使用教程

更多 Spring 文章,欢迎点击 一灰灰 Blog-Spring 专题

Redis 的五大数据结构,目前就剩下最后的 ZSET,可以简单的理解为带权重的集合;与前面的 set 最大的区别,就是每个元素可以设置一个 score,从而可以实现各种排行榜的功能
原文地址: 181212-SpringBoot 高级篇 Redis 之 ZSet 数据结构使用姿势
I. 基本使用
在开始之前,序列化的指定需要额外处理,前面 List 这一篇已经提及,相关内容可以参考:
181109-SpringBoot 高级篇 Redis 之 List 数据结构使用姿势
1. 新增元素
新增元素时,用起来和 set 差不多,无非是多一个 score 的参数指定而已
如果元素存在,会用新的 score 来替换原来的,返回 0;如果元素不存在,则会会新增一个
/**
* 添加一个元素, zset 与 set 最大的区别就是每个元素都有一个 score,因此有个排序的辅助功能; zadd
*
* @param key
* @param value
* @param score
*/
public void add(String key, String value, double score) {
redisTemplate.opsForZSet().add(key, value, score);
}
2. 删除元素
删除就和普通的 set 没啥区别了
/**
* 删除元素 zrem
*
* @param key
* @param value
*/
public void remove(String key, String value) {
redisTemplate.opsForZSet().remove(key, value);
}
3. 修改 score
zset 中的元素塞入之后,可以修改其 score 的值,通过 zincrby 来对 score 进行加 / 减;当元素不存在时,则会新插入一个
从上面的描述来看,zincrby 与 zadd 最大的区别是前者是增量修改;后者是覆盖 score 方式
/**
* score 的增加 or 减少 zincrby
*
* @param key
* @param value
* @param score
*/
public Double incrScore(String key, String value, double score) {
return redisTemplate.opsForZSet().incrementScore(key, value, score);
}
4. 获取 value 对应的 score
这个需要注意的是,当 value 在集合中时,返回其 score;如果不在,则返回 null
/**
* 查询 value 对应的 score zscore
*
* @param key
* @param value
* @return
*/
public Double score(String key, String value) {
return redisTemplate.opsForZSet().score(key, value);
}
5. 获取 value 在集合中排名
前面是获取 value 对应的 score;这里则是获取排名;这里 score 越小排名越高;
从这个使用也可以看出结合 4、5, 用 zset 来做排行榜可以很简单的获取某个用户在所有人中的排名与积分
/**
* 判断 value 在 zset 中的排名 zrank
*
* @param key
* @param value
* @return
*/
public Long rank(String key, String value) {
return redisTemplate.opsForZSet().rank(key, value);
}
6. 集合大小
/**
* 返回集合的长度
*
* @param key
* @return
*/
public Long size(String key) {
return redisTemplate.opsForZSet().zCard(key);
}
7. 获取集合中数据
因为是有序,所以就可以获取指定范围的数据,下面有两种方式

根据排序位置获取数据
根据 score 区间获取排序位置

/**
* 查询集合中指定顺序的值,0 -1 表示获取全部的集合内容 zrange
*
* 返回有序的集合,score 小的在前面
*
* @param key
* @param start
* @param end
* @return
*/
public Set<String> range(String key, int start, int end) {
return redisTemplate.opsForZSet().range(key, start, end);
}

/**
* 查询集合中指定顺序的值和 score,0, -1 表示获取全部的集合内容
*
* @param key
* @param start
* @param end
* @return
*/
public Set<ZSetOperations.TypedTuple<String>> rangeWithScore(String key, int start, int end) {
return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
}

/**
* 查询集合中指定顺序的值 zrevrange
*
* 返回有序的集合中,score 大的在前面
*
* @param key
* @param start
* @param end
* @return
*/
public Set<String> revRange(String key, int start, int end) {
return redisTemplate.opsForZSet().reverseRange(key, start, end);
}

/**
* 根据 score 的值,来获取满足条件的集合 zrangebyscore
*
* @param key
* @param min
* @param max
* @return
*/
public Set<String> sortRange(String key, int min, int max) {
return redisTemplate.opsForZSet().rangeByScore(key, min, max);
}
II. 其他
0. 项目
工程:spring-boot-demo

1. 一灰灰 Blog

一灰灰 Blog 个人博客 https://blog.hhui.top

一灰灰 Blog-Spring 专题博客 http://spring.hhui.top

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

微博地址: 小灰灰 Blog

QQ:一灰灰 /3302797840

3. 扫描关注
一灰灰 blog

知识星球

退出移动版