Redis数据类型—Zset类型

134 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

redis Zset是有序集合,和Set类型一样,它也不允许有重复的元素,每一个元素都会关联一个double类型的分数,Zset正是依据这个double类型的分数来给元素进行排序的;在Zset中元素是唯一的,但是分数是可以重复的;下面来介绍一下Zset常用的一些命令:

ZADD命令

zadd key score1 value1 [score2 value2] ......

示例:

redis> zadd my_zset 9.9 hello
1

zadd命令用来添加元素,并同时给该元素一个score,以便在集合中进行排序;

ZCARD命令

zcard key

示例:

redis> zadd my_zset 9.9 hello
1
redis> zadd my_zset 6.8 world
1
redis> zcard my_zset
2

zcard命令是获取有序集合中的元素的总数;

ZCOUNT命令

zcount key min max

示例:

redis> zcount my_zset 1.5 8.8
1
redis> zcount my_zset 1.5 10.0
2

zcount命令计算在有序集合中,在指定区间分数的元素数量;

ZINCRBY命令

zincrby key step value

示例:

redis> zadd my_zset 6.8 world
1
redis> zincrby my_zset 5.5 world
12.300000000000001

zincrby命令用来给有序集合中指定元素增加分数;该示例中给my_zset有序集合中的world元素增加了5.5分,现在该元素的分数是12.3分,从结果上看,double型分数是会丢失精度的;

ZINTERSTORE命令

zinterstore destination numbers key1 key2 ......

示例:

redis> zadd my_zset 9.9 hello 6.8 world
3
redis> zadd your_zset 6.6 java 7.9 rust 8.9 world
3
redis> zinterstore target_zset 2 my_zset your_zset
1
redis> zrange target_zset 0 -1
0 world

zinterstore命令统计一个或多个有序集合的交集,并将结果集存储到target_zset中,上述示例中,2表示参与比较的的有序集合数量;

ZLEXCOUNT命令

zlexcount key min max

示例:

redis> zadd lex_zset 1 atomic 1 bob 1 charls 1 deal
4
redis> zlexcount lex_zset [bob [charls
2
redis> zlexcount lex_zset [b [charls
2
redis> zlexcount lex_zset [b [charl
1

当所有元素的分数相同时,zlexcount命令用来统计在元素本身排序后,在[min, max]区间范围内的元素数量;示例中的[其实就是区间的表达式,也可以使用(

ZRANGE命令

zrange key start stop [withscores]

示例:

redis> zrange my_zset 0 -1 withscores
0 hello
1 9.9000000000000004
2 world
3 12.300000000000001
redis> zrange my_zset 0 -1
0 hello
1 world

zrange命令根据索引区间查询出区间内的元素,加上withscores将同时返回元素对应的分数;

ZRANGEBYLEX命令

zrangebylex key min max [limit offset count]

示例:

redis> zrangebylex lex_zset [b [charls
0 bob
1 charls
redis> zrangebylex lex_zset [b [charls limit 0 1
0 bob

zrangebylex命令和zlexcount命令类似,基于所有元素分数相同的情况下,按照元素本身排序后的结果做区间查询,还可以带上limit分页操作;

ZRANGEBYSCORE命令

zrangebyscore key min max [withscores] [limit]

示例:

redis> zrangebyscore my_zset 5 (12.6 withscores
0 hello
1 9.9000000000000004
2 world
3 12.300000000000001
redis> zrangebyscore my_zset 5 (12.6 withscores limit 0 1
0 hello
1 9.9000000000000004

zrangebyscore命令可以根据分数区间来做查询,并可以跟上withscores来决定结果集中要不要显示分数,与limit配合可以做分页处理;

ZRANK命令

zrank key value

示例:

redis> zrank my_zset hello
0
redis> zrank my_zset world
1

zrank命令用来返回指定元素的索引值;

ZREM命令

zrem key value1 value2 ......

示例:

redis> zrem my_zset hello
1
redis> zrange my_zset 0 -1
0 world

zrem命令用来移除有序集合中的一个或多个元素;

ZREMRANGEBYLEX命令

zremrangebylex key min max

示例:

redis> zremrangebylex lex_zset [b [charls
2
redis> zrange lex_zset 0 -1
0 atomic
1 deal

zremrangebylex将根据min~max区间来移除指定元素;

ZREMRANGEBYRANK命令

zremrangebyrank key start stop

示例:

redis> zadd num_zset 1 one 2 two 3 three 4 four 5 five
5
redis> zremrangebyrank num_zset 2 3
2
redis> zrange num_zset 0 -1
0 one
1 two
2 five

zremrangebyrank命令将按照索引区间来删除元素;

ZREMRANGEBYSCORE命令

zremrangebyscore key min max

示例:

redis> zadd score_zset 1.1 one 2.2 two 3.3 three 4.4 four 5.5 five
5
redis> zremrangebyscore score_zset 3 5
2
redis> zrange score_zset 0 -1
0 one
1 two
2 five

zremrangebyscore命令根据分数区间来删除指定元素;

ZREVRANGE命令

zrevrange key start stop [withscores]

示例:

redis> zadd num_zset 1 one 2 two 3 three 4 four 5 five
5
redis> zrevrange num_zset 2 4 withscores
0 three
1 3
2 two
3 2
4 one
5 1

zrevrange命令按照索引倒数,three对应倒数索引2,one对应倒数索引4,分数从高到低返回结果集;

ZREVRANGEBYSCORE命令

zrevrangebyscore key max min [withscores] [limit]

示例:

redis> zrevrangebyscore num_zset 4.5 2.1
0 four
1 three
redis> zrevrangebyscore num_zset 4.5 2.1 withscores
0 four
1 4
2 three
3 3
redis> zrevrangebyscore num_zset 4.5 2.1 withscores limit 0 1
0 four
1 4

zrevrangebyscore命令根据分数范围倒序排列返回查询结果;可以带上withscoreslimit参数;

ZREVRANK命令

zrevrank key value

示例:

redis> zrevrank num_zset one
4
redis> zrevrank num_zset five
0

zrevrank命令返回该元素在有序集合中的倒数索引;

ZSCORE命令

zscore key value

示例:

redis> zadd score_zset 1.1 one 2.2 two 3.3 three 4.4 four 5.5 five
5
redis> zscore score_zset five
5.5

zscore命令返回该元素在有序集合中的分数值;

ZUNIONSTORE命令

zunionstore destination numbers key1 key2 ......

示例:

redis> zrange my_zset 0 -1
0 hello
1 world
redis> zrange your_zset 0 -1
0 java
1 rust
2 world
redis> zunionstore union_zset 2 my_zset your_zset
4
redis> zrange union_zset 0 -1
0 hello
1 java
2 rust
3 world

zunionstore命令用来合并一个或多个有序集合,并将结果集存储到指定的union_zset有序集合中;