- Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
- 有序集合的成员是唯一的,但分数(score)却可以是重复的
- 集合是通过哈希表实现的,所以添加、删除、查找的时间复杂度为O(1)。集合中最大的成员数为2^32 -1,每个集合可存储40多亿个成员。
常见命令
zadd sortset 1 a
zadd sortset 2 b
zadd sortset 3 c
zadd sortset 0 d
zrange sortset 0 10 //默认的是从小到大排序
zrange sortset 0 10 withscores//得到对应的分数
zcard key:获取有序集合的成员 数
zcount key min max:计算在有序集合总指定区间分数的成员数
zincrby key increment member
zrank key member://返回member在集合中的索引(从大排到小)
zrevrank key member//返回member在集合中的索引(从小排到大)
zrem key member://移除集合中的member成员
zscore key member//获取member的得分
JavaSE集合体系中的Set+List的结合体,元素唯一、有序存储! SCORE分数值
API练习
@Test
public void method4(){
final String key = "SpringBootRedis:SortedSet:10010:V1";
redisTemplate.delete(key);
ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet();
zSetOperations.add(key, "a", 8.0);
zSetOperations.add(key, "b", 2.0);
zSetOperations.add(key, "c", 4.0);
zSetOperations.add(key, "d", 6.0);
zSetOperations.add(key, "f", 1.0);
long size = zSetOperations.size(key);
log.info("--有序集合SortedSet-成员数:{}", size);
log.info("--有序集合SortedSet-按照分数正序:{}", zSetOperations.range(key, 0L, size));
log.info("--有序集合SortedSet-按照分数倒序:{}", zSetOperations.reverseRange(key, 0L, size));
log.info("--有序集合SortedSet-获取成员a的得分:{}", zSetOperations.score(key, "a"));
log.info("--有序集合SortedSet-获取成员c的得分:{}", zSetOperations.score(key, "c"));
log.info("--有序集合SortedSet-正序中d的排名:{} 名", zSetOperations.rank(key, "d"));
log.info("--有序集合SortedSet-倒序中d的排名:{} 名", zSetOperations.reverseRank(key, "d"));
zSetOperations.incrementScore(key, "b", 8.0);
log.info("--为元素b加10分后,有序集合SortedSet-按照分数倒数:{}", zSetOperations.reverseRange(key, 0L, size));
zSetOperations.remove(key, "b");
log.info("--移除元素b后有序集合SortedSet-按照分数倒数:{}", zSetOperations.range(key, 0L, zSetOperations.size(key)));
log.info("--有序集合SortedSet-取出分数区间0-7的成员:{}", zSetOperations.range(key, 0, 7));
log.info("--有序集合SortedSet-取出带分数的排好序的成员");
Set<ZSetOperations.TypedTuple<String>> set = zSetOperations.rangeWithScores(key, 0, zSetOperations.size(key));
set.forEach(tuple -> {
log.info("--当前成员:{}, 对应的分数:{}", tuple.getValue(), tuple.getScore());
});
}
}