RedisTemplate实现排行榜
Joel
发布于 2022-06-26 / 1144 阅读 / 0 评论 / 3 点赞

RedisTemplate实现排行榜

zset

Redis中的zset和set一样也是 string 类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

RedisTemplate中对应的方法

方法 说明
Boolean add(K key, V value, double score) 将单个元素添加到 key 处的排序集,或者如果它已经存在则更新其分数
Long add(K key, Set<ZSetOperations.TypedTuple> tuples) 将元素集添加到 key 的排序集中,如果它已经存在则更新它的分数
Long count(K key, double min, double max) 返回排序集中的元素个数,分数介于 min 和之间 max
Double incrementScore(K key, V value, double delta) 向集合 key 中值为 value 的元素增加分数 delta
Long intersectAndStore(K key, Collection otherKeys, K destKey) 在 key 和 otherKeys 处相交排序集并将结果存储在目标 destKey 中
default Long intersectAndStore(K key, Collection otherKeys, K destKey, RedisZSetCommands.Aggregate aggregate) 在 key 和 otherKeys 处相交排序集并将结果存储在目标 destKey
Long intersectAndStore(K key, Collection otherKeys, K destKey, RedisZSetCommands.Aggregate aggregate, RedisZSetCommands.Weights weights) 在 key 和 otherKeys 处相交排序集并将结果存储在目标 destKey
Long intersectAndStore(K key, K otherKey, K destKey) 在 key 和 otherKey 处相交排序集并将结果存储在目标 destKey
Set range(K key, long start, long end) 返回排序集中下标 start 到 end 之间的元素,顺序从小到大排序
Set reverseRange(K key, long start, long end) 返回排序集中下标 start 到 end 之间的元素,顺序从大到小排序
Set rangeByLex(K key, RedisZSetCommands.Range range) 返回排序集合中获取所有具有字典顺序的元素,其值介于 RedisZSetCommands.Range.getMin() 和 RedisZSetCommands.Range.getMax() 之间的元素
Set rangeByLex(K key, RedisZSetCommands.Range range, RedisZSetCommands.Limit limit) 获取所有元素 n 个元素,其中 n = RedisZSetCommands.Limit.getCount(),从 RedisZSetCommands.Limit.getOffset() 开始,从 ZSET 的字典顺序开始,其值介于 RedisZSetCommands.Range.getMin() 和 RedisZSetCommands.Range.getMax ()
Set rangeByScore(K key, double min, double max) 从排序集中获取分数在 min 和 max 之间的元素
Set rangeByScore(K key, double min, double max, long offset, long count) 获取从下标从 offset 到 count 范围内的元素,其中分数在排序集中的 min 和 max 之间
Long rank(K key, Object o) 返回排序集中值为 o 的元素的索引
Long remove(K key, Object… values) 从排序集中删除值为 values 的元素
Long removeRange(K key, long start, long end) 从排序集中删除 start 和 end 之间范围内的元素
Long removeRangeByScore(K key, double min, double max) 从排序集中删除分数在 min 和 max 之间的元素
Set reverseRange(K key, long start, long end) 从排序(顺序从大到小)反转的有序集合中获取从 start 到 end 范围内的元素
Set reverseRangeByScore(K key, double min, double max) 从排序(顺序从大到小)反转的有序集合中获取分数在 min 和 max 之间的元素
Set reverseRangeByScore(K key, double min, double max, long offset, long count) 从排序(顺序从大到小)反转的有序集合中获取从 start 到 end,获取分数在 min 和 max 之间的元素
Long reverseRank(K key, Object o) 当从高到低时,确定排序集中具有 o 值的元素的索引
Double score(K key, Object o) 返回指定 key 从排序集中获取具有 o 值的元素的分数
Long size(K key) 返回指定 key 的有序集合的元素数
Long zCard(K key) 使用 key 获取排序集的大小

代码

@SpringBootTest
class RedisDomeApplicationTests {

    @Autowired(required = false)
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void contextLoads() {
        Set<ZSetOperations.TypedTuple<String>> typedTupleSet = new HashSet<>();
	//批量添加
        typedTupleSet.add(ZSetOperations.TypedTuple.of("告白气球", Double.valueOf(1)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("Mojito", Double.valueOf(2)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("晴天", Double.valueOf(3)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("等你下课", Double.valueOf(4)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("听妈妈的话", Double.valueOf(5)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("一路向北", Double.valueOf(6)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("说好不哭", Double.valueOf(7)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("龙卷风", Double.valueOf(8)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("夜曲", Double.valueOf(9)));
        typedTupleSet.add(ZSetOperations.TypedTuple.of("稻香", Double.valueOf(10)));
        stringRedisTemplate.opsForZSet().add("周杰伦",typedTupleSet);

    }

}

Snipaste_2022-06-26_15-55-01

//增加分数
        stringRedisTemplate.opsForZSet().incrementScore("周杰伦","告白气球",1);
//排行榜前5名
      Set set = stringRedisTemplate.opsForZSet().reverseRange("周杰伦", 0, 4);
      System.out.println(set.toString());

Snipaste_2022-06-26_16-14-47


评论