3.6 有序集合类型
3.6.1 介绍
有序集合类型(sorted set)的特点从它的名字中就可以猜到,它与上一节介绍的集合类型的区别就是“有序”二字。
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数(score),这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都是不同的,但是它们的分数却可以相同。有序集合类型在
某些方面和列表类型有些相似。
- (1)二者都是有序的。
- (2)二者都可以获得某一范围的元素。
但是二者有着很大的区别,这使得它们的应用场景也是不同的。
- (1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。
- (2)有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(log(N)))。
- (3)列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
- (4)有序集合要比列表类型更耗费内存。有序集合类型算得上是 Redis的5种数据类型中最高级的类型了,在学习时可以与列表类型和集合类型对照理解。
3.6.2 命令
1.增加元素
ZADD key score member [score member …]
ZADD命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。ZADD命令的返回值是新加入到集合中的元素个数(不包含之前已经存在的元素)。
假设我们用有序集合模拟计分板,现在要记录Tom、Peter和David三名运动员的分数(分别是89分、67分和100分):
redis>ZADD scoreboard 89 Tom 67 Peter 100 David
(integer) 3
这时我们发现Peter的分数录入有误,实际的分数应该是76分,可以用ZADD命令修改Peter的分数:
redis>ZADD scoreboard 76 Peter
(integer) 0
分数不仅可以是整数,还支持
双精度浮点数:
redis>ZADD testboard 17E+307 a
(integer) 1
redis>ZADD testboard 1.5 b
(integer) 1
redis>ZADD testboard +inf c
(integer) 1
redis>ZADD testboard -inf d
(integer) 1
其中+inf和-inf分别表示正无穷和负无穷。
2.获得元素的分数
ZSCORE key member
示例如下:
redis>ZSCORE scoreboard Tom
"89"
3.获得排名在某个范围的元素列表
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZRANGE命令会按照元素
分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。ZRANGE命令与LRANGE命令十分相似,如索引都是从0开始,负数代表从后向前查找(-1表示最后一个元素)。就像这样:
redis>ZRANGE scoreboard 0 2
1) "Peter"
2) "Tom"
3) "David"
redis>ZRANGE scoreboard 1 -1
1) "Tom"
2) "David"
如果需要同时获得元素的分数的话可以在ZRANGE命令的尾部加上WITHSCORES参数,这时返回的数据格式就从“元素1, 元素2, …, 元素n”变为了“元素1, 分数1, 元素2, 分数2, …, 元
素n, 分数n”,例如:
redis>ZRANGE scoreboard 0 -1 WITHSCORES
1) "Peter"
2) "76"
3) "Tom"
4) "89"
5) "David"
6) "100"
ZRANGE命令的时间复杂度为0(logn+m)(其中n为有序集合的基数,m为返回的元素个数)。
如果两个元素的
分数相同,Redis会按照字典顺序(即"0"<"9"<"A"<"Z"<"a"<"z"这样的顺序)来进行排列。再进一步,如果元素的值是
中文怎么处理呢?答案是
取决于中文的编码方式,如使用UTF-8编码:
redis>ZADD chineseName 0 马华 0 刘墉 0 司马光 0 赵哲
(integer) 4
redis>ZRANGE chineseName 0 -1
1) "\xe5\x88\x98\xe5\xa2\x89"
2) "\xe5\x8f\xb8\xe9\xa9\xac\xe5\x85\x89"
3) "\xe8\xb5\xb5\xe5\x93\xb2"
4) "\xe9\xa9\xac\xe5\x8d\x8e"
可见此时Redis依然按照字典顺序排列这些元素。
ZREVRANGE命令和ZRANGE的唯一不同在于ZREVRANGE命令是按照元素分数从大到小的顺序给出结果的。
4.获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZRANGEBYSCORE命令参数虽然多,但是都很好理解。该命令按照元素分数从小到大的顺序返回分数在min和max之间(包含min和max)的元素:
redis>ZRANGEBYSCORE scoreboard 80 100
1) "Tom"
2) "David"
如果希望分数范围不包含端点值,可以在分数前加上“(”符号。例如,希望返回80分到100分的数据,可以含80分,但不包含100分,则稍微修改一下上面的命令即可:
redis>ZRANGEBYSCORE scoreboard 80 (100
1) "Tom"
min和max还支持无穷大,同ZADD命令一样,-inf 和+inf分别表示负无穷和正无穷。比如你希望得到所有分数高于80分(不包含80分)的人的名单,但你却不知道最高分是多少(虽然有些
背离现实,但是为了叙述方便,这里假设可以获得的分数是无上限的),这时就可以用上+inf了:
redis>ZRANGEBYSCORE scoreboard (80 +inf
1) "Tom"
2) "David"
WITHSCORES参数的用法与ZRANGE命令一样,不再赘述。
了解SQL语句的读者对LIMIT offset count应该很熟悉,在本命令中LIMIToffset count与SQL中的用法基本相同,即在获得的元素列表的基础上向后偏移offset个元素,并且只获取前count
个元素。为了便于演示,我们先向scoreboard键中再增加些元素:
redis>ZADD scoreboard 56 Jerry 92 Wendy 67 Yvonne
(integer) 3
现在scoreboard键中的所有元素为:
redis>ZRANGE scoreboard 0 -1 WITHSCORES
1) "Jerry"
2) "56"
3) "Yvonne"
4) "67"
5) "Peter"
6) "76"
7) "Tom"
8) "89"
9) "Wendy"
10) "92"
11) "David"
12) "100"
想获得分数高于60分的从第二个人开始的3个人:
redis>ZRANGEBYSCORE scoreboard 60 +inf LIMIT 1 3
1) "Peter"
2) "Tom"
3) "Wendy"
5.增加某个元素的分数
ZINCRBY key increment member
ZINCRBY命令可以增加一个元素的分数,返回值是更改后的分数。例如,想给Jerry加4分:
redis>ZINCRBY scoreboard 4 Jerry
"60"
increment也可以是个负数表示减分,例如,给Jerry减4分:
redis>ZINCRBY scoreboard -4 Jerry
" 56"
如果指定的元素不存在,Redis在执行命令前会先建立它并将它的分数赋为0再执行操作。
6.获得集合中元素的数量
ZCARD key
例如:
redis>ZCARD scoreboard
(integer) 6
7.获得指定分数范围內的元素个数
ZCOUNT key min max
例如:
redis>ZCOUNT scoreboard 90 100
(integer) 2
ZCOUNT命令的min和max参数的特性与ZRANGEBYSCORE命令中的一样:
redis>ZCOUNT scoreboard (89 +inf
(integer) 2
8.删除一个或多个元素
ZREM key member [member …]
ZREM命令的返回值是成功删除的元素数量(不包含本来就不存在的元素)。
redis>ZREM scoreboard Wendy
(integer) 1
redis>ZCARD scoreboard
(integer) 5
9.按照排名范围删除元素
ZREMRANGEBYRANK key start stop
ZREMRANGEBYRANK命令按照元素分数从小到大的顺序(即索引0表示最小的值)删除处在指定排名范围内的所有元素,并返回删除的元素数量。如:
redis>ZADD testRem 1 a 2 b 3 c 4 d 5 e 6 f
(integer) 6
redis>ZREMRANGEBYRANK 0 2
(integer) 3
redis>ZRANGE testRem 0 -1
1) "d"
2) "e"
3) "f"
10.按照分数范围删除元素
ZREMRANGEBYSCORE key min max
ZREMRANGEBYSCORE命令会删除指定分数范围内的所有元素,参数min和max的特性和ZRANGEBYSCORE命令中的一样。返回值是删除的元素数量。如:
redis>ZREMRANGEBYSCORE testRem (4 5
(integer) 1
redis>ZRANGE testRem 0 -1
1) "d"
2) "f"
11.获得元素的排名
ZRANK key member
ZREVRANK key member
ZRANK命令会按照元素分数从小到大的顺序获得指定的元素的排名(从0开始,即分数最小的元素排名为0)。如:
redis>ZRANK scoreboard Peter
(integer) 0
ZREVRANK命令则相反(分数最大的元素排名为0):
redis>ZREVRANK scoreboard Peter
(integer) 4
至此,redis支持的5种数据类型(String, Hash, List, Set, Sorted Set)的基本用法全部介绍完了,后面将介绍redis的事务等高级特性。
分享到:
相关推荐
1. **数据类型**: Redis支持五大数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),这些类型为各种应用场景提供了丰富的选择。 2. **持久化**: Redis提供了两种主要的持久化...
Redis的数据结构丰富多样,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构的设计使得Redis在处理多种数据操作时展现出高效性能。例如,字符串可以用于存储...
1. 数据类型:Redis支持五种基本的数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据类型可以满足各种不同的应用场景,例如缓存、计数器、发布订阅等。 ...
Redis支持多种数据类型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据类型允许用户以灵活的方式存储和操作数据。 在Windows上安装Redis-x64-5.0.14,首先需要...
它的设计目标是速度和数据持久化,支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,这使得Redis在处理复杂的数据操作时具有很高的效率。 标题"redis-windows-redis7.0.5.zip"表明这是一个针对Windows...
集合(Set)和有序集合(Sorted Set)提供了一种无重复成员的数据结构,有序集合还能根据成员的分数进行排序。 Redis还支持主从复制,可以创建多个副本以提高可用性和容错性。在3.0.504版本中,可以配置主节点和从...
它的设计目标是速度极快,且支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)以及有序集合(sorted sets)。Redis在内存中存储数据,并可定期或按需将数据持久化到磁盘,以确保...
6. **数据结构与操作**:Redis 支持多种数据结构,如 String(字符串)、Hash(哈希表)、List(列表)、Set(集合)、Sorted Set(有序集合)。例如,`SET key value` 用于设置键值对,`GET key` 用于获取键对应的...
Redis的设计理念在于提供低延迟、高并发的键值存储服务,它支持多种数据结构,包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和有序集合(sorted sets)。这些数据结构使得Redis在处理各种...
Redis支持多种数据类型,除了基本的字符串外,还有哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构在处理不同类型的业务需求时非常有用,例如缓存、消息队列、计数器等。Redis还...
Redis以其高效的性能、丰富的数据结构和便捷的操作接口,在IT行业中广泛应用,尤其在大型程序开发中作为数据存储解决方案,发挥了重要作用。 在你提供的压缩包"Redis-x64-5.0.14.1.zip"中,包含的是Redis 5.0.14的...
1. **数据类型**:Redis支持五种基本数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),这些类型提供了丰富的操作命令,满足各种应用场景。 2. **高性能**:Redis通过内存...
PHPRedis是由NicolasFF开发的一个开源项目,它提供了丰富的Redis命令支持,包括数据结构如字符串、哈希表、列表、集合、有序集合等。通过此扩展,开发者可以充分利用Redis的高性能特性,如内存存储、持久化、主从...
首先,Redis支持多种数据类型,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets)。这些数据类型不仅满足基本的键值存储需求,还能处理更复杂的数据操作,如列表的推入...
3. **丰富的数据结构**:除了基本的字符串,Redis还支持哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),这些数据结构可以满足多种复杂应用场景的需求。 4. **事务处理**:Redis提供了事务...
`redis-py`是Python社区广泛使用的Redis客户端,它提供了丰富的API来操作Redis的各种数据结构,如字符串、哈希、列表、集合、有序集合等。以下将详细介绍`redis-py`中的关键概念和用法: 1. **连接Redis服务器**: ...
Redis支持多种数据类型,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets)。这些数据结构设计得既灵活又高效,能够满足不同场景的需求。例如,字符串常用于简单的键值存储,哈希...
Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构使得Redis在处理各种场景时非常灵活。 5. **持久化**: Redis提供两种持久化方式:RDB(快照...
Redis支持多种数据类型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构使得Redis在处理多种场景时非常灵活,比如缓存、计数器、发布/订阅等。 对于Java...
它支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和有序集合(sorted sets)。Redis 使用二进制协议,性能优异,且提供了丰富的客户端库,适用于多种编程语言。 2. **版本 ...