1.1. 一、Sorted sets的介绍。

Sorted sets也叫zset,是一种数据结构,类似于集合和哈希之间的混合。像集合一样,Sorted sets由唯一的非重复的字符串元素组成,因此从某种意义上说,Sorted sets也是一个集合。Sorted sets的每个元素都与一个浮点值类型的得分(score)相关联。排序规则如下:

  • 如果A和B是两个分数(score)不同的元素,如果A.score > B.score,则A>B。
  • 如果A和B的分数(score)完全相同,那么如果A字符串在字典上大于B字符串,则A>B。(A和B字符串不能相等,因为Sorted sets中元素是唯一的)。

1.1.1. 排序方式:

Sorted sets按照分数以递增的方式进行排序。相同的成员(member)只存在一次,Sorted sets不允许存在重复的成员。 分数可以通过ZADD命令进行更新或者也可以通过ZINCRBY命令递增来修改之前的值,相应的他们的排序位置也会随着分数变化而改变。

获取一个成员当前的分数可以使用ZSCORE命令,也可以用它来验证成员是否存在。

更多关于有序集合的信息请参考数据类型-有序集合

1.1.2. 相同分数的成员

Sorted sets里面的成员是不能重复的都是唯一的,但是,不同成员间有可能有相同的分数。当多个成员有相同的分数时,他们将是有序的字典(ordered lexicographically)(仍由分数作为第一排序条件,然后,相同分数的成员按照字典规则相对排序)。

字典顺序排序用的是二进制,它比较的是字符串的字节数组。

如果用户将所有元素设置相同分数(例如0),有序集合里面的所有元素将按照字典顺序进行排序,范围查询元素可以使用ZRANGEBYLEX命令(注:范围查询分数可以使用ZRANGEBYSCORE命令)。

1.1.3. 应用场景:

  • topN的情况。比如:电商中的热销商品。
  • 字符串排序。比如:省市区根据名字排序。可以把分数(score)设置相同。查询出的就是按照名字排序的。

1.2. 二、Sorted sets 的操作。

1.2.1. 2.1、增加。

增加一个Sorted sets的命令是:zadd key [NX|XX] [CH] [INCR] score member [score member ...]

ZADD 命令在key后面是分数/成员(score/member)对前面支持一些参数,他们是:

  • XX: 仅仅更新存在的成员,不添加新成员。
  • NX: 不更新存在的成员。只添加新成员。
  • CH: 修改返回值为发生变化的成员总数(CH 是 changed 的意思)。默认是返回新添加成员的总数 。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。
  • INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。

例子如下:

# 给 mystus 键,添加2个元素:zhangsan 30分,lisi 60分。返回值是添加了多少元素。
# mystus 就是根据得分排序的有序集合(Sorted sets)。
localhost:6379> zadd mystus 30 zhangsan 60 lisi
(integer) 2
# 给 mystus 键,添加1个元素:wanger 40分
localhost:6379> zadd mystus 40 wanger
(integer) 1

ZADDSADD相似,但是使用一个额外的参数(放置在要添加的元素之前)作为得分。

1.2.2. 2.2、查询。

2.2.1、使用索引查询元素。

  • 查询命令,按分数正序返回ZRANGE key start stop [WITHSCORES]

    start:表示索引的开始位置。最小值从0开始。返回值包含start的元素。

    stop:表示索引的结束位置。-1表示最后一个元素。返回值包含stop的元素。

    withscores:是否连分数一起查询。

  • 查询命令,按分数倒序方式返回ZREVRANGE key start stop [WITHSCORES]

例子1:查询集合所有的元素。

注意:0和-1表示从元素索引0到最后一个元素。

localhost:6379> ZRANGE mystus 0 -1
1) "zhangsan"
2) "wanger"
3) "lisi"

例子2:带上分数。

localhost:6379> ZRANGE mystus 0 1 withscores
1) "zhangsan"
2) "30"
3) "wanger"
4) "40"

例子3:按照分数倒序返回。

localhost:6379> ZREVRANGE mystus 0 -1 withscores
1) "lisi"
2) "60"
3) "wanger"
4) "40"
5) "zhangsan"
6) "30"
localhost:6379> ZREVRANGE mystus 0 -1
1) "lisi"
2) "wanger"
3) "zhangsan"

2.2.2、使用索引分页查询元素。

命令:ZRANGEBYLEX key min max [LIMIT offset count]

这个命令的使用内容比较多,参考官方中文文档:http://www.redis.cn/commands/zrangebylex.html

2.2.3、使用分数分页查询元素。

命令:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

1、返回key的有序集合中的分数在min和max之间的所有元素(包括分数等于max或者min的元素)。元素被认为是从低分到高分排序的。具有相同分数的元素按字典序排列。

2、LIMIT参数指定返回结果的数量及区间(类似SQL中SELECT LIMIT offset, count)。注意,如果offset太大,定位offset就可能遍历整个有序集合,这会增加O(N)的复杂度。

3、参数WITHSCORES会返回元素和其分数,而不只是元素。

4、min和max可以用-inf表示最小分数,+inf表示最大分数,这样一来,你就可以在不知道有序集的最低和最高score值的情况下,使用ZRANGEBYSCORE这类命令。

5、默认情况下,min和max的取值是包含关系(小于等于或大于等于),也可以给min和max参数前增加(符号来使用不包含的关系(小于或大于)。

例子如下:

# 查询全部元素和分数
localhost:6379> ZRANGE mystus 0 -1 withscores
1) "zhangsan"
2) "30"
3) "wanger"
4) "40"
5) "lisi"
6) "60"
# ZRANGEBYSCORE 查询全部元素
localhost:6379> ZRANGEBYSCORE mystus -inf +inf
1) "zhangsan"
2) "wanger"
3) "lisi"
# ZRANGEBYSCORE 查询分数>40 的元素
localhost:6379> ZRANGEBYSCORE mystus (40 +inf
1) "lisi"
# 30<=分数<40
localhost:6379> ZRANGEBYSCORE mystus 30 (40
1) "zhangsan"
# 30<分数<60
localhost:6379> ZRANGEBYSCORE mystus (30 (60
1) "wanger"
# 分数<60
localhost:6379> ZRANGEBYSCORE mystus -inf (60
1) "zhangsan"
2) "wanger"
# 分数<60的元素中,只返回索引从0开始,返回数量1个。
localhost:6379> ZRANGEBYSCORE mystus -inf (60 limit 0 1
1) "zhangsan"
# 查询分数=30的元素,可能是多个。
localhost:6379> ZRANGEBYSCORE mystus 30 30
1) "zhangsan"

2.2.4、根据分数查询元素。

# 查询分数=30的元素,可能是多个。
localhost:6379> ZRANGEBYSCORE mystus 30 30
1) "zhangsan"

2.2.5、根据元素查询分数。

命令:ZSCORE key member

返回有序集key中,成员member的score值。如果member元素不是有序集key的成员,或key不存在,返回nil。

# 查询有序集合 mystus 中,元素zhangsan的分数
localhost:6379> ZSCORE mystus zhangsan
"30"

1.2.3. 2.3、修改。

2.3.1、修改分数。

根据有序集合的成员,修改其分数。命令:ZINCRBY key increment member

为有序集key的成员member的score值加上增量increment。如果key中不存在member,就在key中添加一个member,score是increment。如果key不存在,就创建一个只含有指定member成员的有序集合。

当key不是有序集类型时,返回一个错误。

score值必须是字符串表示的整数值或双精度浮点数,并且能接受double精度的浮点数。也有可能给一个负数来减少score的值

返回值:member成员的新score值,以字符串形式表示。

localhost:6379> ZRANGE mystus 0 -1 withscores
1) "zhangsan"
2) "30"
3) "wanger"
4) "40"
5) "lisi"
6) "60"
# 给 zhangsan 加61分
localhost:6379> ZINCRBY mystus 61 zhangsan
"91"
localhost:6379> ZRANGE mystus 0 -1 withscores
1) "wanger"
2) "40"
3) "lisi"
4) "60"
5) "zhangsan"
6) "91"
# 给 zhangsan 减2分
localhost:6379> ZINCRBY mystus -2 zhangsan
"89"
localhost:6379> ZRANGE mystus 0 -1 withscores
1) "wanger"
2) "40"
3) "lisi"
4) "60"
5) "zhangsan"
6) "89"
# 给不存在的元素 tom 减2分
localhost:6379> ZINCRBY mystus -2 tom
"-2"
localhost:6379> ZRANGE mystus 0 -1 withscores
1) "tom"
2) "-2"
3) "wanger"
4) "40"
5) "lisi"
6) "60"
7) "zhangsan"
8) "89"

2.3.2、修改元素。

根据分数有可能查询出很多元素,所以不能根据分数修改元素。

1.2.4. 2.4、删除。

删除可以参考下面的文档:

results matching ""

    No results matching ""