首页 > 解决方案 > 为什么从 redis zset 构造的 HashSet 保持排序?

问题描述

在 Java 中,HashSet 是未排序的,如下所示:

        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(4);
        set.add(3);
        set.add(2);
        set.add(5);
        set.forEach(e-> System.out.print(e+" "));

它的输出是:

1 2 3 4 5

当 java set 来自 zset 时,像这样:

redisTemplate.opsForZSet().add(key, 1, 0);
redisTemplate.opsForZSet().add(key, 4, 1);
redisTemplate.opsForZSet().add(key, 3, 2);
redisTemplate.opsForZSet().add(key, 2, 3);
redisTemplate.opsForZSet().add(key, 5, 4);
Set<Integer> set = redisTemplate.opsForZSet().range(key, 0, -1);
System.out.println(set.getClass());
set.forEach(e-> System.out.print(e+" "));

输出是:

java.util.HashSet
1 4 3 2 5

为什么此时输出保持顺序作为输入?

标签: redisjedisspring-cache

解决方案


ZSET 是按分数排序的,而不是 ZSET 中成员的键。所以在你的例子中:

redisTemplate.opsForZSet().add(key, 1, 0);
redisTemplate.opsForZSet().add(key, 4, 1);
redisTemplate.opsForZSet().add(key, 3, 2);
redisTemplate.opsForZSet().add(key, 2, 3);
redisTemplate.opsForZSet().add(key, 5, 4);

1得分为05得分为4。如果您将其更改为:

redisTemplate.opsForZSet().add(key, 1, 1);
redisTemplate.opsForZSet().add(key, 4, 4);
redisTemplate.opsForZSet().add(key, 3, 3);
redisTemplate.opsForZSet().add(key, 2, 2);
redisTemplate.opsForZSet().add(key, 5, 5);

你应该得到预期的结果。


推荐阅读