【Redis笔记(六)】 Redis数据结构 - 有序集合zset

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50638679

今天我们来学习Redis的最后一种数据结构 – 有序集合zset。


zset类型简单介绍

Redis不仅仅提供了无序的集合(sets)(详细可以参考上一篇文章【Redis笔记(五)】 Redis数据结构 - set集合),还提供了有序的集合zset。在有序集合中,每个元素都关联有一个权重或者称作分数,作为排序的依据。我们经常把有序集合称作zsets,这是因为在Redis中,有序集合相关的操作指令都是以字母z开头的(具体看下面的命令介绍)。

有序集合相关命令

1、zadd命令

zadd命令可以将一个或多个元素添加到集合中,如果指定的元素已经存在则更新该元素的分数。该命令返回添加到集合中的元素个数(不包括已经存在而被更新分数的元素)。具体格式如下:

zadd key score1 value1...

示例1:

127.0.0.1:6379> zadd myzset 1 hello
(integer) 1
127.0.0.1:6379> zadd myzset 2 hello 2 world
(integer) 1

2、zrange命令

zrange命令将集合元素按分数升序排序,然后返回下标范围为[start,stop]的元素。跟前面介绍的set数据类型一样,有序集合的下标也是从0开始计算,也可以用负数表示从尾部开始的偏移量。
另外,该命令还可以加withscore选项把每个元素关联的分数打印出来。具体格式如下:

zrange key start stop [withscore]

示例2:

127.0.0.1:6379> zadd myset 1 a 2 b 3 c 4 d
(integer) 4
127.0.0.1:6379> zrange myset 0 -1 
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> zrange myset 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"

3、zrevrange命令

zrevrange命令与zrange命令相似,可以用来返回排序后指定下标范围的元素列表,不同的是该命令按元素分数降序排序。具体格式如下:

zrevrange key start stop [withscore]

4、zrank命令

zrank命令返回指定元素在有序集合中按升序排序后的排名。注意,该排名是从0开始计算的。如果该元素不存在,则返回nil。具体格式如下:

zrank key member

示例4:

127.0.0.1:6379> zadd myset 10 hello 20 world
(integer) 2
127.0.0.1:6379> zrank myset hello
(integer) 0
127.0.0.1:6379> zrank myset nonhello
(nil)

5、zrevrank命令

zrevrank命令与zrank命令相似,可以返回指定元素在有序集合中的排名。不同的是zrevrank对集合中的元素按分数降序排序,而zrank命令按升序排序。具体格式如下:

zrevrank key member

示例5:

127.0.0.1:6379> zadd myset 0 a 2 b 3 c 4 d 5 e 
(integer) 5
127.0.0.1:6379> zrevrank myset a
(integer) 4

6、zrangebyscore命令

zrangebyscore命令和mysql中的“order by ” + “limit”语句相似。先看一下该命令的具体格式:

zrangebyscore key min max [withscores] [limit offset N]

该命令先将集合中的元素按“分数”从小到大排序,然后返回分数在[min,max]内的元素,并且可以跳过offset元素,取其后的N个元素。其中[withscores]、[limit offset N]为可选项。

示例6:

127.0.0.1:6379> zadd myset 0 a 2 b 3 c 4 d 5 e 
(integer) 5
127.0.0.1:6379> zrangebyscore myset 1 3
1) "b"
2) "c"
127.0.0.1:6379> zrangebyscore myset 1 3 limit 2 1 // 跳过两个
(empty list or set)
127.0.0.1:6379> zrangebyscore myset 1 3 limit 1 1   // 跳过一个
1) "c"

7、zrem命令

zrem命令用来删除集合中的一个或多个元素。如果该被删除元素不在有序集合中,则自动忽略。具体格式如下:

zrem key value1 value2...

示例7:

127.0.0.1:6379> zadd myset 0 a 2 b 3 c 4 d 5 e 
(integer) 5
127.0.0.1:6379> zrem myset b f
(integer) 1
127.0.0.1:6379> zrange myset 0 -1
1) "a"
2) "c"
3) "d"
4) "e"

8、zremrangebyrank命令

zremrangebyrank命令按照排名来删除元素,将排名在[min,max]范围内的元素删除并返回被删除的元素数量。注意,有序集合的排序是以0开始计算的。具体格式如下:

zremrangebyrank key start end

示例8:

127.0.0.1:6379> zadd myset 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zremrangebyrank myset 0 2
(integer) 3
127.0.0.1:6379> zrange myset 0 -1
1) "d"
2) "e"

9、zremrangebyscore命令

前面zremrangebyrank命令可以根据元素排名来删除元素,而zremrangebyscore命令则可以根据元素分数来删除元素。该命令将分数在[min,max]范围内的元素删除并返回被删除的元素数量。具体格式如下:

zremrangebyscore key min max

示例9:

127.0.0.1:6379> zadd myset 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zremrangebyscore myset 4 5
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "a"
2) "b"
3) "c"

10、zcard命令

zcard命令用来返回有序集合中元素的个数。具体格式如下:

zcard key

示例10:

127.0.0.1:6379> zadd myset 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zcard myset
(integer) 5

11、zcount命令

zcount命令返回分数在指定范围的元素个数。具体格式如下:

zcount key min max

示例11:

127.0.0.1:6379> zadd myset 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zcount myset 1 3
(integer) 3

12、zincrby命令

zincrby命令用来增加有序集合中指定元素的分数。如果该元素在集合中不存在,则先添加该元素,并将其分数设置为0,然后在这基础上再增加其分数。

zincrby key increment member

示例12:

127.0.0.1:6379> zadd myset 1 a
(integer) 1
127.0.0.1:6379> zincrby myset 2 a
"3"

13、zscore命令

zscore命令返回指定元素所关联的分数,如果该元素不存在集合中则返回nil。具体格式如下:

zscore key member

示例13:

127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zscore myset hello
"1"

有序集合sorted sets的命令大概就是这些,到现在为止,我们就完成了Redis五种基本数据结构的学习。

Redis中的zset有序集合,而set是无序集合。 在zset中,每个元素都有一个score字段,通过score和index来进行排序。zset的实现是使用了两种数据结构,分别是跳跃表和字典。跳跃表用于实现元素的有序排列,而字典用于实现元素的唯一性。zset的插入、删除和查找操作的时间复杂度都是O(logN)。 而set是一个无序的字符串集合集合中的元素不可重复。在set中,元素的插入、删除和查找操作的时间复杂度都是O(1)。set的底层实现是通过哈希表来存储元素,类似于Java中的Hashtable集合。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [9. redis 数据结构-set、zset](https://blog.csdn.net/wojiuguowei/article/details/81866600)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Redis学习笔记(九)---Redis数据类型之Set 和 Zset](https://blog.csdn.net/TheWindOfSon/article/details/104169173)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值