Redis

Redis 知识量:6 - 20 - 96

2.5 Sorted Set类型><

Sorted Set类型- 2.5.1 -

Redis的Sorted Set是一种有序集合,其元素都是唯一的,但分数(score)可以重复。每个元素都关联一个double类型的分数,通过分数对元素进行排序。Sorted Set中的每个元素都带有一个分数属性,这个分数属性可以用于对元素进行排序。底层的实现是一个跳表(SkipList)加 hash table。

Sorted Set具备下列特性:

  • 可排序:由于每个元素都有一个与之关联的分数,因此可以通过这个分数对元素进行排序。

  • 元素不重复:与Redis的Set类似,Sorted Set中的元素是唯一的,不会有重复的元素。

  • 查询速度快:由于Sorted Set的实现是跳表和哈希表的混合体,因此查询速度非常快。

Sorted Set经常被用来实现排行榜这样的功能。例如,可以把要排序的字段作为分数存储,对象的ID当元素存储。这样,可以通过Sorted Set来快速地获取排名靠前的元素。

Sorted Set类型数据操作指令包括:zadd、zrem、zincrby、zrank、zrevrank、zrange、zrevrange、zrangebyscore、zcount、zcard、zscore等。这些指令允许添加元素到集合,删除指定元素,增加元素的分数并移动元素,获取指定元素的排名,获取指定区间的元素等。

ZADD- 2.5.2 -

ZADD是Redis中用于添加或更新一个或多个元素及其分数到有序集合的命令。

语法:

ZADD key score member [score member ...]

参数:

  • key:有序集合的键名。

  • score:要添加或更新的元素的分数。

  • member:要添加或更新的元素。

返回值:

  • 如果元素已存在,则返回0,表示分数没有更新。

  • 如果元素不存在,则返回1,表示元素被添加到集合中。

  • 如果操作成功,返回操作影响的元素数量。

示例:

ZADD myzset 90 apple    
ZADD myzset 80 banana 70 cherry

上述命令将添加或更新三个元素:"apple"、"banana"和"cherry"到名为"myzset"的有序集合中,它们的分数分别为90、80和70。如果元素已经存在于集合中,则更新其分数。

ZREM- 2.5.3 -

ZREM是Redis中用于从有序集合中移除一个或多个元素的命令。

语法:

ZREM key member [member ...]

参数:

  • key:有序集合的键名。

  • member:要移除的元素。可以一次移除多个元素,用逗号分隔。

返回值:

  • 返回被移除的元素数量。

  • 如果集合不存在或元素不存在,则返回0。

示例:

ZREM myzset apple banana cherry

上述命令将尝试从名为"myzset"的有序集合中移除三个元素:"apple"、"banana"和"cherry"。如果集合中存在这些元素,它们将被成功移除;否则,没有进行任何操作。

ZCARD- 2.5.4 -

ZCARD是Redis中用于获取有序集合的元素数量的命令。

语法:

ZCARD key

参数:

  • key:有序集合的键名。

返回值:

  • 返回有序集合的元素数量。

  • 如果键不存在,则返回0。

示例:

ZCARD myzset

上述命令将返回名为"myzset"的有序集合的元素数量。

ZCOUNT- 2.5.5 -

ZCOUNT是Redis中用于计算有序集合中指定分数区间的成员数量的命令。

语法:

ZCOUNT key min max

参数:

  • key:有序集合的键名。

  • min和max:分数值在min和max之间的成员数量。

返回值:

  • 分数值在min和max之间的成员的数量。

  • 如果键不存在,则返回0。

示例:

ZCOUNT myzset 1 100

上述命令将返回在分数值介于1和100之间的成员数量,从名为"myzset"的有序集合中计算得出。

ZSCORE- 2.5.6 -

ZSCORE是Redis中用于获取有序集合中指定元素的分数的命令。

语法:

ZSCORE key member

参数:

  • key:有序集合的键名。

  • member:要获取分数的元素。

返回值:

  • 返回指定元素的分数。

  • 如果元素不存在于集合中,则返回nil。

示例:

ZSCORE myzset apple

上述命令将返回名为"myzset"的有序集合中元素"apple"的分数。如果元素不存在,则返回nil。

ZRANGE- 2.5.7 -

ZRANGE是Redis中用于获取有序集合中指定区间内的成员的命令。

语法:

ZRANGE key start stop [WITHSCORES]

参数:

  • key:有序集合的键名。

  • start和stop:区间的起始和结束位置。它们是相对于有序集合中的元素位置的索引,以0为基数的索引表示第一个元素,1表示第二个元素,以此类推。也可以使用负数索引表示从集合末尾开始的位置,-1表示最后一个元素,-2表示倒数第二个元素,以此类推。

  • WITHSCORES:可选参数,用于同时返回每个元素的分数。如果不使用WITHSCORES参数,则只返回元素本身。

返回值:

  • 返回指定区间内的成员。如果使用了WITHSCORES参数,则同时返回每个元素的分数。

  • 如果集合不存在或索引超出范围,则返回一个空列表。

示例:

ZRANGE myzset 0 1 WITHSCORES

上述命令将返回名为"myzset"的有序集合中位置在0和1之间的成员及其分数。这表示从集合的第一个元素到第二个元素之间的成员和它们的分数。如果集合不存在或索引超出范围,则返回一个空列表。

ZREVRANGE- 2.5.8 -

ZREVrange是Redis中用于获取有序集合中指定区间内的成员,按照分数从高到低排序的命令。

语法:

ZREVRANGE key start stop [WITHSCORES]

参数:

  • key:有序集合的键名。

  • start和stop:区间的起始和结束位置。它们是相对于有序集合中的元素位置的索引,以0为基数的索引表示第一个元素,1表示第二个元素,以此类推。也可以使用负数索引表示从集合末尾开始的位置,-1表示最后一个元素,-2表示倒数第二个元素,以此类推。

  • WITHSCORES:可选参数,用于同时返回每个元素的分数。如果不使用WITHSCORES参数,则只返回元素本身。

返回值:

  • 返回指定区间内的成员。如果使用了WITHSCORES参数,则同时返回每个元素的分数。

  • 如果集合不存在或索引超出范围,则返回一个空列表。

示例:

ZREVRANGE myzset 0 1 WITHSCORES

上述命令将返回名为"myzset"的有序集合中位置在0和1之间的成员及其分数,按照分数从高到低排序。如果集合不存在或索引超出范围,则返回一个空列表。

ZREVRANGEBYSCORE- 2.5.9 -

ZREVrangebyscore用于返回有序集中指定分数区间内的所有成员,并按照分数从高到低排序。

ZREVRANGEBYSCORE的语法如下:

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

其中,key是集合的键名,max和min是分数区间的上限和下限。返回的成员按照分数从高到低排序。

如果使用WITHSCORES选项,命令将同时返回每个元素的分数。LIMIT选项用于限制返回的成员数量,通过指定偏移量和数量来达到分页的效果。

例如,以下命令将返回键名为"myzset"的有序集合中分数在1和5之间的所有成员,按照分数从高到低排序,并返回包括分数的成员列表:

ZREVRANGEBYSCORE myzset 5 1 WITHSCORES

这个命令将返回一个有序的成员列表,其中每个成员都带有其对应的分数。如果没有指定WITHSCORES选项,则只返回成员本身。

ZREVRANGEBYSCORE命令具有以下特性:

  • 它按照分数从高到低排序返回成员。这与ZRANGEBYSCORE命令相反,ZRANGEBYSCORE命令按照分数从低到高排序返回成员。

  • 它支持使用WITHSCORES选项来获取包括分数的成员列表。这对于需要同时获取成员和其分数的场景非常有用。

  • 它支持使用LIMIT选项来限制返回的成员数量,这在分页场景中非常有用。

  • 它只返回分数在指定区间内的成员,可以用于过滤和筛选集合中的元素。