redis - 为什么从 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
为什么此时输出保持顺序作为输入?
解决方案
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
得分为0
,5
得分为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);
你应该得到预期的结果。
推荐阅读
- python - 如何修复此 Jquery bootstrap.bundle.min.js:6 导航栏中出现的错误?
- python-3.x - 为什么我无法将我的 Python 脚本连接到我的 SQL 文件?
- python - 如何编写包装器来修复函数中的任意参数
- c - 是否可以在 C 中返回不同的“false”?
- python-3.x - 如何更改之间的值蟒蛇lxml
- c - 如何在C中的二维数组中找到最高和最低数字及其位置
- json - 如何在我的 android 应用程序中添加 JSON 获取方法
- javascript - 打字稿符号异步功能作为类型/接口属性
- javascript - 在 P5.js 中改变对象高度的正弦函数
- javascript - 用javascript制作计算器的CE功能