键key
命令 |
时间复杂度 |
命令描述 |
返回值 |
del key |
O(N) |
在key存在时删除key |
被移除key的数量 |
dump key |
O(N) |
序列话给定key,并返回被序列化的值 |
|
exists key |
O(1) |
检查给定key是否存在 |
若key存在,返回1,否则返回0。 |
expire key seconds |
O(1) |
为给定key设置过期时间 |
设置成功返回1。 当key不存在或者不能为key设置生存时间时(比如在低于2.1.3中你尝试更新key的生存时间),返回0。 |
expireat key timestamp |
O(1) |
同上 |
如果生存时间设置成功,返回1。 当key不存在或没办法设置生存时间,返回0。 |
pexpire key milliseconds |
O(1) |
设置 key 的过期时间,以毫秒计 |
|
pexpireat key milliseconds-timestamp |
O(1) |
设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
|
ttl key |
O(1) |
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live) |
key的剩余生存时间(以秒为单位)。 当key不存在或没有设置生存时间时,返回-1 。 |
pttl key |
O(1) |
以毫秒为单位返回 key 的剩余的过期时间 |
|
persist key |
O(1) |
移除 key 的过期时间,key 将持久保持 |
当生存时间移除成功时,返回1. 如果key不存在或key没有设置生存时间,返回0。 |
keys pattern |
O(N) |
查找所有符合给定模式( pattern)的 key |
|
move key db |
O(1) |
将当前数据库的 key 移动到给定的数据库 db 当中 |
移动成功返回1,失败则返回0。 |
randomkey |
O(1) |
从当前数据库中随机返回一个 key |
当数据库不为空时,返回一个key。 当数据库为空时,返回nil。 |
rename key newkey |
O(1) |
修改 key 的名称 |
改名成功时提示OK,失败时候返回一个错误。 |
renamenx key newkey |
O(1) |
仅当 newkey 不存在时,将 key 改名为 newkey |
修改成功时,返回1。 如果newkey已经存在,返回0。 |
type key |
O(1) |
返回 key 所储存的值的类型 |
none(key不存在) string(字符串) list(列表) set(集合) zset(有序集) hash(哈希表) |
对key设置查看生存时间 |
expire,expireat,pexpire,pexpireat;ttl,pttl;persist; |
删除key |
del |
查看key |
key pattern |
重命名key |
rename,renamenx |
其他 |
type,move,dump,exists, |
字符串string
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
命令原型 |
时间复杂度 |
命令描述 |
返回值 |
append key value |
O(1) |
如果该key已经存在,append命令将参数value的数据追加到已存在value的末尾。如果该key不存在,append命令将会创建一个新的key/value。 |
追加后value的长度。 |
decr key |
O(1) |
将指定key的value原子性的递减1。如果该key不存在,其初始值为0,在decr之后其值为-1。如果value的值不能转换为整型值,如hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。 |
递减后的value值。 |
incr key |
O(1) |
将指定key的value原子性的递增1。如果该key不存在,其初始值为0,在incr之后其值为1。如果value的值不能转换为整型值,如hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。 |
递增后的value值。 |
decrby key decrement |
O(1) |
将指定key的value原子性的减少decrement。如果该key不存在,其初始值为0,在decrby之后其值为-decrement。如果value的值不能转换为整型值,如hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。 |
减少后的value值。 |
incrby key increment |
O(1) |
将指定key的value原子性的增加increment。如果该key不存在,其初始值为0,在incrby之后其值为increment。如果value的值不能转换为整型值,如hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。 |
增加后的value值。 |
get key |
O(1) |
获取指定key的value。如果与该key关联的value不是string类型,redis将返回错误信息,因为get命令只能用于获取string value。 |
与该key相关的value,如果该key不存在,返回nil。 |
set key value |
O(1) |
设定该key持有指定的字符串value,如果该key已经存在,则覆盖其原有值。 |
总是返回"ok"。 |
get set key value |
O(1) |
原子性的设置该key为指定的value,同时返回该key的原有值。和get命令一样,该命令也只能处理string value,否则redis将给出相关的错误信息。 |
返回该key的原有值,如果该key之前并不存在,则返回nil。 |
strlen key |
O(1) |
返回指定key的字符值长度,如果value不是string类型,redis将执行失败并给出相关的错误信息。 |
返回指定key的value字符长度,如果该key不存在,返回0。 |
setexkey seconds value |
O(1) |
原子性完成两个操作,一是设置该key的值为指定字符串,同时设置该key在redis服务器中的存活时间(秒数)。该命令主要应用于redis被当做cache服务器使用时。 |
|
setnxkey value |
O(1) |
如果指定的key不存在,则设定该key持有指定字符串value,此时其效果等价于set命令。相反,如果该key已经存在,该命令将不做任何操作并返回。 |
1表示设置成功,否则0。 |
setrangekey offset value |
O(1) |
替换指定key的部分字符串值。从offset开始,替换的长度为该命令第三个参数value的字符串长度,其中如果offset的值大于该key的原有值value的字符串长度,redis将会在value的后面补齐(offset - strlen(value))数量的0x00,之后再追加新值。如果该键不存在,该命令会将其原值的长度假设为0,并在其后添补offset个0x00后再追加新值。鉴于字符串value的最大长度为512m,因此offset的最大值为536870911。最后需要注意的是,如果该命令在执行时致使指定key的原有值长度增加,这将会导致redis重新分配足够的内存以容纳替换后的全部字符串,因此就会带来一定的性能折损。 |
修改后的字符串value长度。 |
getrangekey start end |
O(1) |
如果截取的字符串长度很短,我们可以该命令的时间复杂度视为o(1),否则就是o(n),这里n表示截取的子字符串长度。该命令在截取子字符串时,将以闭区间的方式同时包含start(0表示第一个字符)和end所在的字符,如果end值超过value的字符长度,该命令将只是截取从start开始之后所有的字符数据。 |
子字符串 |
setbitkey offset value |
O(1) |
设置在指定offset上bit的值,该值只能为1或0,在设定后该命令返回该offset上原有的bit值。如果指定key不存在,该命令将创建一个新值,并在指定的offset上设定参数中的bit值。如果offset大于value的字符长度,redis将拉长value值并在指定offset上设置参数中的bit值,中间添加的bit值为0。最后需要说明的是offset值必须大于0。 |
在指定offset上的bit原有值。 |
getbitkey offset |
O(1) |
返回在指定offset上bit的值,0或1。如果offset超过string value的长度,该命令将返回0,所以对于空字符串始终返回0。 |
在指定offset上的bit值。 |
mgetkey [key ...] |
O(N) |
n表示获取key的数量。返回所有指定keys的values,如果其中某个key不存在,或者其值不为string类型,该key的value将返回nil。 |
返回一组指定keys的values的列表。 |
msetkey value [key value ...] |
O(N) |
n表示指定key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行set命令。 |
该命令不会失败,始终返回ok。 |
msetnxkey value [key value ...] |
O(N) |
n表示指定key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行setnx命令。然而这里需要明确说明的是,如果在这一批keys中有任意一个key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。 |
1表示所有keys都设置成功,0则表示没有任何key被修改。 |
set |
set,setnx,setrange,mset,mestnx,append,getset |
get |
get,mget,getrange, |
对数字字符串加减 |
incr,incrby,incrbyfloat/ decr,decrby--increment(增量),decrement(减量) |
对二进制数字符串操作 |
setbit,getbit,bitop,bitcount |
其他 |
strlen,setex(存在多少秒),psetex(存在多少毫秒) |
哈希hash
我们可以将Redis中的Hash类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储键值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
令原型 |
时间复杂度 |
命令描述 |
返回值 |
hset key field value |
O(1) |
为指定的Key设定Field/Value对,如果Key不存在,该命令将创建新Key以参数中的Field/Value对,如果参数中的Field在该Key中已经存在,则用新值覆盖其原有值。 |
1表示新的Field被设置了新值,0表示Field已经存在,用新值覆盖原有值。 |
hget key field |
O(1) |
返回指定Key中指定Field的关联值。 |
返回参数中Field的关联值,如果参数中的Key或Field不存,返回nil。 |
hexists key field |
O(1) |
判断指定Key中的指定Field是否存在。 |
1表示存在,0表示参数中的Field或Key不存在。 |
hlen key |
O(1) |
获取该Key所包含的Field的数量。 |
返回Key包含的Field数量,如果Key不存在,返回0。 |
hdel key field [field ...] |
O(N) |
时间复杂度中的N表示参数中待删除的字段数量。从指定Key的Hashes Value中删除参数中指定的多个字段,如果不存在的字段将被忽略。如果Key不存在,则将其视为空Hashes,并返回0. |
实际删除的Field数量。 |
hsetnxkey field value |
O(1) |
只有当参数中的Key或Field不存在的情况下,为指定的Key设定Field/Value对,否则该命令不会进行任何操作。 |
1表示新的Field被设置了新值,0表示Key或Field已经存在,该命令没有进行任何操作。 |
hincrby key field increment |
O(1) |
增加指定Key中指定Field关联的Value的值。如果Key或Field不存在,该命令将会创建一个新Key或新Field,并将其关联的Value初始化为0,之后再指定数字增加的操作。该命令支持的数字是64位有符号整型,即increment可以负数。 |
返回运算后的值。 |
hgetall key |
O(N) |
时间复杂度中的N表示Key包含的Field数量。获取该键包含的所有Field/Value。其返回格式为一个Field、一个Value,并以此类推。 |
Field/Value的列表。 |
hkeys key |
O(N) |
时间复杂度中的N表示Key包含的Field数量。返回指定Key的所有Fields名。 |
Field的列表。 |
hvalskey |
O(N) |
时间复杂度中的N表示Key包含的Field数量。返回指定Key的所有Values名。 |
Value的列表。 |
hmgetkey field [field ...] |
O(N) |
时间复杂度中的N表示请求的Field数量。获取和参数中指定Fields关联的一组Values。如果请求的Field不存在,其值返回nil。如果Key不存在,该命令将其视为空Hash,因此返回一组nil。 |
返回和请求Fields关联的一组Values,其返回顺序等同于Fields的请求顺序。 |
hmset key field value [field value ...] |
O(N) |
时间复杂度中的N表示被设置的Field数量。逐对依次设置参数中给出的Field/Value对。如果其中某个Field已经存在,则用新值覆盖原有值。如果Key不存在,则创建新Key,同时设定参数中的Field/Value。 |
set |
hset,hsetnx,hmset, |
get |
hget,hmget,hgetall,hkeys(所有域),hvals(所有域值) |
对value进行增量 |
hincrby,hincrbyfloat |
其他 |
hlen,hdel,hexists |
列表List
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
链表结构的小技巧:
针对链表结构的Value,Redis在其官方文档中给出了一些实用技巧,如RPOPLPUSH命令,下面给出具体的解释。
Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
命令原型 |
时间复杂度 |
命令描述 |
返回值 |
lpushkey value [value ...] |
O(1) |
在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。 |
插入后链表中元素的数量。 |
lpushx key value |
O(1) |
仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的头部插入参数中给出的Value,否则将不会有任何操作发生。 |
插入后链表中元素的数量。 |
lrange key start stop |
O(S+N) |
时间复杂度中的S为start参数表示的偏移量,N表示元素的数量。该命令的参数start和end都是0-based。即0表示链表头部(leftmost)的第一个元素。其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素。 |
返回指定范围内元素的列表。 |
lpopkey |
O(1) |
返回并弹出指定Key关联的链表中的第一个元素,即头部元素,。如果该Key不存,返回nil。 |
链表头部的元素。 |
llenkey |
O(1) |
返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0。如果与该Key关联的Value的类型不是链表,则返回相关的错误信息。 |
链表中元素的数量。 |
lremkey count value |
O(N) |
时间复杂度中N表示链表中元素的数量。在指定Key关联的链表中,删除前count个值等于value的元素。如果count大于0,从头向尾遍历并删除,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。如果指定的Key不存在,则直接返回0。 |
返回被删除的元素数量。 |
lsetkey index value |
O(N) |
时间复杂度中N表示链表中元素的数量。但是设定头部或尾部的元素时,其时间复杂度为O(1)。设定链表中指定位置的值为新值,其中0表示第一个元素,即头部元素,-1表示尾部元素。如果索引值Index超出了链表中元素的数量范围,该命令将返回相关的错误信息。 |
|
lindex key index |
O(N) |
时间复杂度中N表示在找到该元素时需要遍历的元素数量。对于头部或尾部元素,其时间复杂度为O(1)。该命令将返回链表中指定位置(index)的元素,index是0-based,表示头部元素,如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息。 |
返回请求的元素,如果index超出范围,则返回nil。 |
ltrimkey start stop |
O(N) |
N表示被删除的元素数量。该命令将仅保留指定范围内的元素,从而保证链接中的元素数量相对恒定。start和stop参数都是0-based,0表示头部元素。和其他命令一样,start和stop也可以为负值,-1表示尾部元素。如果start大于链表的尾部,或start大于stop,该命令不错报错,而是返回一个空的链表,与此同时该Key也将被删除。如果stop大于元素的数量,则保留从start开始剩余的所有元素。 |
|
linsert key before|after pivot value |
O(N) |
时间复杂度中N表示在找到该元素pivot之前需要遍历的元素数量。这样意味着如果pivot位于链表的头部或尾部时,该命令的时间复杂度为O(1)。该命令的功能是在pivot元素的前面或后面插入参数中的元素value。如果Key不存在,该命令将不执行任何操作。如果与Key关联的Value类型不是链表,相关的错误信息将被返回。 |
成功插入后链表中元素的数量,如果没有找到pivot,返回-1,如果key不存在,返回0。 |
rpush key value [value ...] |
O(1) |
在指定Key所关联的List Value的尾部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的尾部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。 |
插入后链表中元素的数量。 |
rpushx key value |
O(1) |
仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的尾部插入参数中给出的Value,否则将不会有任何操作发生。 |
插入后链表中元素的数量。 |
rpopkey |
O(1) |
返回并弹出指定Key关联的链表中的最后一个元素,即尾部元素,。如果该Key不存,返回nil。 |
链表尾部的元素。 |
rpoplpushsource destination |
O(1) |
原子性的从与source键关联的链表尾部弹出一个元素,同时再将弹出的元素插入到与destination键关联的链表的头部。如果source键不存在,该命令将返回nil,同时不再做任何其它的操作了。如果source和destination是同一个键,则相当于原子性的将其关联链表中的尾部元素移到该链表的头部。 |
返回弹出和插入的元素。 |
set |
lpush,lpushx,rpush,rpushx,lset,linset,rpoplpush,brpoplpush |
get |
lpop,rpop,blpop,brpop,lrange,lindex |
其他 |
llen,ltrim,lrem |
集合set
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。
和List类型不同的是,Set集合中不允许出现重复的元素,这一点和C++标准库中的set容器是完全相同的。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。
应用范围:
1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。
命令原型 |
时间复杂度 |
命令描述 |
返回值 |
saddkey member [member ...] |
O(N) |
时间复杂度中的N表示操作的成员数量。如果在插入的过程用,参数中有的成员在Set中已经存在,该成员将被忽略,而其它成员仍将会被正常插入。如果执行该命令之前,该Key并不存在,该命令将会创建一个新的Set,此后再将参数中的成员陆续插入。如果该Key的Value不是Set类型,该命令将返回相关的错误信息。 |
本次操作实际插入的成员数量。 |
scardkey |
O(1) |
获取Set中成员的数量。 |
返回Set中成员的数量,如果该Key并不存在,返回0。 |
sismember key member |
O(1) |
判断参数中指定成员是否已经存在于与Key相关联的Set集合中。 |
1表示已经存在,0表示不存在,或该Key本身并不存在。 |
smembers key |
O(N) |
时间复杂度中的N表示Set中已经存在的成员数量。获取与该Key关联的Set中所有的成员。 |
返回Set中所有的成员。 |
spopkey |
O(1) |
随机的移除并返回Set中的某一成员。 由于Set中元素的布局不受外部控制,因此无法像List那样确定哪个元素位于Set的头部或者尾部。 |
返回移除的成员,如果该Key并不存在,则返回nil。 |
sremkey member [member ...] |
O(N) |
时间复杂度中的N表示被删除的成员数量。从与Key关联的Set中删除参数中指定的成员,不存在的参数成员将被忽略,如果该Key并不存在,将视为空Set处理。 |
从Set中实际移除的成员数量,如果没有则返回0。 |
srandmember key |
O(1) |
和SPOP一样,随机的返回Set中的一个成员,不同的是该命令并不会删除返回的成员。 |
返回随机位置的成员,如果Key不存在则返回nil。 |
smovesource destination member |
O(1) |
原子性的将参数中的成员从source键移入到destination键所关联的Set中。因此在某一时刻,该成员或者出现在source中,或者出现在destination中。如果该成员在source中并不存在,该命令将不会再执行任何操作并返回0,否则,该成员将从source移入到destination。如果此时该成员已经在destination中存在,那么该命令仅是将该成员从source中移出。如果和Key关联的Value不是Set,将返回相关的错误信息。 |
1表示正常移动,0表示source中并不包含参数成员。 |
sdiffkey [key ...] |
O(N) |
时间复杂度中的N表示所有Sets中成员的总数量。返回参数中第一个Key所关联的Set和其后所有Keys所关联的Sets中成员的差异。如果Key不存在,则视为空Set。 |
差异结果成员的集合。 |
sdiffstoredestination key [key ...] |
O(N) |
该命令和SDIFF命令在功能上完全相同,两者之间唯一的差别是SDIFF返回差异的结果成员,而该命令将差异成员存储在destination关联的Set中。如果destination键已经存在,该操作将覆盖它的成员。 |
返回差异成员的数量。 |
sinterkey [key ...] |
O(N*M) |
时间复杂度中的N表示最小Set中元素的数量,M则表示参数中Sets的数量。该命令将返回参数中所有Keys关联的Sets中成员的交集。因此如果参数中任何一个Key关联的Set为空,或某一Key不存在,那么该命令的结果将为空集。 |
交集结果成员的集合。 |
sinterstoredestination key [key ...] |
O(N*M) |
该命令和SINTER命令在功能上完全相同,两者之间唯一的差别是SINTER返回交集的结果成员,而该命令将交集成员存储在destination关联的Set中。如果destination键已经存在,该操作将覆盖它的成员。 |
返回交集成员的数量。 |
sunion key [key ...] |
O(N) |
时间复杂度中的N表示所有Sets中成员的总数量。该命令将返回参数中所有Keys关联的Sets中成员的并集。 |
并集结果成员的集合。 |
sunionstoredestination key [key ...] |
O(N) |
该命令和SUNION命令在功能上完全相同,两者之间唯一的差别是SUNION返回并集的结果成员,而该命令将并集成员存储在destination关联的Set中。如果destination键已经存在,该操作将覆盖它的成员。 |
返回并集成员的数量。 |
增加 |
sadd, |
删除 |
srem,smove,spop |
get |
smembers,srandmember |
集合加减 |
sinter,sinterstore,sunion,sunionstore,sdiff,sdiffstore |
其他 |
sismember,scard(片,长度) |
有序集合sorted-set
Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。
在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。
应用范围:
1). 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的获取和某个玩家积分相近的其他用户的信息。
2). Sorted-Sets类型还可用于构建索引数据。
命令原型 |
时间复杂度 |
命令描述 |
返回值 |
zadd key score member [score] [member] |
O(log(N)) |
时间复杂度中的N表示Sorted-Sets中成员的数量。添加参数中指定的所有成员及其分数到指定key的Sorted-Set中,在该命令中我们可以指定多组score/member作为参数。如果在添加时参数中的某一成员已经存在,该命令将更新此成员的分数为新值,同时再将该成员基于新值重新排序。如果键不存在,该命令将为该键创建一个新的Sorted-Sets Value,并将score/member对插入其中。如果该键已经存在,但是与其关联的Value不是Sorted-Sets类型,相关的错误信息将被返回。 |
本次操作实际插入的成员数量。 |
zcard key |
O(1) |
获取与该Key相关联的Sorted-Sets中包含的成员数量。 |
返回Sorted-Sets中的成员数量,如果该Key不存在,返回0。 |
zcountkey min max |
O(log(N)+M) |
时间复杂度中的N表示Sorted-Sets中成员的数量,M则表示min和max之间元素的数量。该命令用于获取分数(score)在min和max之间的成员数量。针对min和max参数需要额外说明的是,-inf和+inf分别表示Sorted-Sets中分数的最高值和最低值。缺省情况下,min和max表示的范围是闭区间范围,即min <= score <= max内的成员将被返回。然而我们可以通过在min和max的前面添加"("字符来表示开区间,如(min max表示min < score <= max,而(min (max表示min < score < max。 |
分数指定范围内成员的数量。 |
zincrbykey increment member |
O(log(N)) |
时间复杂度中的N表示Sorted-Sets中成员的数量。该命令将为指定Key中的指定成员增加指定的分数。如果成员不存在,该命令将添加该成员并假设其初始分数为0,此后再将其分数加上increment。如果Key不存,该命令将创建该Key及其关联的Sorted-Sets,并包含参数指定的成员,其分数为increment参数。如果与该Key关联的不是Sorted-Sets类型,相关的错误信息将被返回。 |
以字符串形式表示的新分数。 |
zrangekey start stop [withscores] |
O(log(N)+M) |
时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令返回顺序在参数start和stop指定范围内的成员,这里start和stop参数都是0-based,即0表示第一个成员,-1表示最后一个成员。如果start大于该Sorted-Set中的最大索引值,或start > stop,此时一个空集合将被返回。如果stop大于最大索引值,该命令将返回从start到集合的最后一个成员。如果命令中带有可选参数WITHSCORES选项,该命令在返回的结果中将包含每个成员的分数值,如value1,score1,value2,score2...。 |
返回索引在start和stop之间的成员列表。 |
zrangebyscore key min max [withscores] [limit offset count] |
O(log(N)+M) |
时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令将返回分数在min和max之间的所有成员,即满足表达式min <= score <= max的成员,其中返回的成员是按照其分数从低到高的顺序返回,如果成员具有相同的分数,则按成员的字典顺序返回。可选参数LIMIT用于限制返回成员的数量范围。可选参数offset表示从符合条件的第offset个成员开始返回,同时返回count个成员。可选参数WITHSCORES的含义参照ZRANGE中该选项的说明。最后需要说明的是参数中min和max的规则可参照命令ZCOUNT。 |
返回分数在指定范围内的成员列表。 |
zrank key member |
O(log(N)) |
时间复杂度中的N表示Sorted-Set中成员的数量。Sorted-Set中的成员都是按照分数从低到高的顺序存储,该命令将返回参数中指定成员的位置值,其中0表示第一个成员,它是Sorted-Set中分数最低的成员。 |
如果该成员存在,则返回它的位置索引值。否则返回nil。 |
zrem key member [member ...] |
O(M log(N)) |
时间复杂度中N表示Sorted-Set中成员的数量,M则表示被删除的成员数量。该命令将移除参数中指定的成员,其中不存在的成员将被忽略。如果与该Key关联的Value不是Sorted-Set,相应的错误信息将被返回。 |
实际被删除的成员数量。 |
zrevrange key startstop [withscores] |
O(log(N)+M) |
时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令的功能和ZRANGE基本相同,唯一的差别在于该命令是通过反向排序获取指定位置的成员,即从高到低的顺序。如果成员具有相同的分数,则按降序字典顺序排序。 |
返回指定的成员列表。 |
zrevrankkey member |
O(log(N)) |
时间复杂度中的N表示Sorted-Set中成员的数量。该命令的功能和ZRANK基本相同,唯一的差别在于该命令获取的索引是从高到低排序后的位置,同样0表示第一个元素,即分数最高的成员。 |
如果该成员存在,则返回它的位置索引值。否则返回nil。 |
zscorekey member |
O(1) |
获取指定Key的指定成员的分数。 |
如果该成员存在,以字符串的形式返回其分数,否则返回nil。 |
zrevrangebyscorekey max min [withscores] [limit offset count] |
O(log(N)+M) |
时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令除了排序方式是基于从高到低的分数排序之外,其它功能和参数含义均与ZRANGEBYSCORE相同。 |
返回分数在指定范围内的成员列表。 |
zremrangebyrankkey start stop |
O(log(N)+M) |
时间复杂度中的N表示Sorted-Set中成员的数量,M则表示被删除的成员数量。删除索引位置位于start和stop之间的成员,start和stop都是0-based,即0表示分数最低的成员,-1表示最后一个成员,即分数最高的成员。 |
被删除的成员数量。 |
zremrangebyscore key min max |
O(log(N)+M) |
时间复杂度中的N表示Sorted-Set中成员的数量,M则表示被删除的成员数量。删除分数在min和max之间的所有成员,即满足表达式min <= score <= max的所有成员。对于min和max参数,可以采用开区间的方式表示,具体规则参照ZCOUNT。 |
被删除的成员数量。 |
增加 |
zadd, |
删除 |
zrem,zremrangebyrank,zremrangebyscore |
get |
zscore,zrange,zrevrange(逆序reverse),zrangebyscore,zrevrangebyscore,zrank,zrevrank |
集合加减 |
zinterstore,zunionstore |
其他 |
zcard,zcount,zincrby |