使用Redis 有序集合zset
zset 是set 类型的一个扩展,比原有的类型多了一个顺序属性.此属性在每次插入数据时会自动调整顺序值,保证value值按照一定顺序连续排列。
实现
1 当新的玩家加入排行榜时候,在redis zset中新增一条记录
zadd overall_ability 62 Tony
zadd:新增的指令
overall_ability:key,即这个排行榜的名称/标识
62:分数
Tony:玩家名称
2 当玩家实力有变化的时候,更新玩家实力
zadd overall_ability 61 Tony
跟新增是一样的
3 获取前100排名
zrevrange overall_ability 0 99
4 查看玩家排名
zrevrank overall_ability Tony
5 查看玩家实时分数
zscore overall_ability Tony
代码
'''
/**
* 添加一个元素, zset与set最大的区别就是每个元素都有一个score,因此有个排序的辅助功能; zadd
*
* @param key
* @param value
* @param score
*/
public void zSetAdd(String key, String value,double score) {
redisTemplate.opsForZSet().add(key, value, score);
}
/**
* 删除元素 zrem
*
* @param key
* @param value
*/
public void zSetRemove(String key, String value) {
redisTemplate.opsForZSet().remove(key, value);
}
/**
* score的增加or减少 zincrby
*
* @param key
* @param value
* @param score
*/
public Double zSetIncrScore(String key, String value,double score) {
return redisTemplate.opsForZSet().incrementScore(key, value, score);
}
/**
* 查询value对应的score zscore
*
* @param key
* @param value
* @return
*/
public Double zSetScore(String key, String value) {
return redisTemplate.opsForZSet().score(key, value);
}
/**
* 判断value在zset中的排名 zrank
*
* 积分小的在前面
*
* @param key
* @param value
* @return
*/
public Long zSetRank(String key, String value) {
return redisTemplate.opsForZSet().rank(key, value);
}
/**
* 判断value在zset中的排名 zrank
*
* 积分小的在前面
*
* @param key
* @param value
* @return
*/
public Long zSetRevRank(String key, String value) {
return redisTemplate.opsForZSet().reverseRank(key, value);
}
/**
* 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容 zrange
*
* 返回有序的集合,score小的在前面
*
* @param key
* @param start
* @param end
* @return
*/
public Set zSetRange(String key,long start,long end) {
return redisTemplate.opsForZSet().range(key, start, end);
}
/**
* 查询集合中指定顺序的值和score,0, -1 表示获取全部的集合内容
*
* @param key
* @param start
* @param end
* @return
*/
public Set> zSetRangeWithScore(String key,long start,long end) {
return redisTemplate.opsForZSet().rangeWithScores(key, start, end);
}
/**
* 查询集合中指定顺序的值 zrevrange
*
* 返回有序的集合中,score大的在前面
*
* @param key
* @param start
* @param end
* @return
*/
public Set zSetRevRange(String key,long start,long end) {
return redisTemplate.opsForZSet().reverseRange(key, start, end);
}
/**
* 根据score的值,来获取满足条件的集合 zrangebyscore
*
* @param key
* @param min
* @param max
* @return
*/
public Set zSetSortRange(String key,long min,long max) {
return redisTemplate.opsForZSet().rangeByScore(key, min, max);
}
/**
* 返回集合的长度
*
* @param key
* @return
*/
public Long zSetSize(String key) {
return redisTemplate.opsForZSet().zCard(key);
}
'''