redis - 为什么由redis zset构建的HashSet保持排序?

标签 redis jedis spring-cache

在 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集来自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

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

最佳答案

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

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);

您应该会得到预期的结果。

关于redis - 为什么由redis zset构建的HashSet保持排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55591160/

相关文章:

java - 如何在节点死亡时java客户端连接Redis集群

redis - 在 spring boot 和 redis 中使用 @Cacheable 与 Spring MongoDB 集成进行缓存

java - 以实例变量和参数为键的Spring缓存

Spring @Cacheable 默认 TTL

spring - 使用 Spring Redis key 安全吗?

json - Redis 获取 “\” 到 JSON 字符串

redis - 如何保留前 10 个成员并删除 Redis 排序集的其余部分?

Redis集群创建

java - Redis/java - 写入和读取二进制数据

Java 客户端无法连接到在本地主机上运行的 Redis Sentinel