相关文章redis
Redis 的命令详解 - Key 篇
Redis 的命令详解 - String 篇
Redis 的命令详解 - Hash 篇
Redis 的命令详解 - SET 篇bash
跟 Hash 相关的命令一共有 17 种,这里只介绍经常使用的,其余请参考官网服务器
起始版本 : 1.0.0
时间复杂度 : 添加一个元素为O(1),添加多个元素为O(N),N为要添加的元素个数。post
将全部指定的值插入到存于 key 的列表的左端。若是 key 不存在,则在操做执行以前将其建立为空列表。若是key对应的value不是 list 类型时,则返回错误。spa
推入多个元素时,多个元素从左到右依次推入左端。例如,LPUSH mylist a b c
先推入a,结果为a。在推入b,结果为ba。最后推入c,结果为cbacode
LPUSH key 元素1 [元素2 ...]
索引
推入元素后列表的长度队列
redis 版本 >= 2.4时,可接受多个element参数。在低于2.4的Redis版本中,只能接受一个element参数事务
起始版本 : 2.2.0
时间复杂度 : 添加一个元素为O(1),添加多个元素为O(N),N为要添加的元素个数。element
只有当 key 存在,而且对应的 value 是 list 类型的时候,才执行操做。
LPUSHX key 元素1 [元素2 ...]
推入元素后列表的长度
redis 版本 >= 4.0时,可接受多个element参数。在低于4.0的Redis版本中,只能接受一个element参数。
起始版本 : 1.0.0
时间复杂度 : 添加一个元素为O(1),添加多个元素为O(N),N为要添加的元素个数。
将全部指定的值插入到存于 key 的列表的右端。若是 key 不存在,则在操做执行以前将其建立为空列表。若是key对应的value不是 list 类型时,则返回错误。
推入多个元素时,多个元素从左到右依次推入右端。例如,RPUSH mylist a b c
先推入a,结果为a。在推入b,结果为ba。最后推入c,结果为cba
RPUSH key 元素1 [元素2 ...]
推入元素后列表的长度
redis 版本 >= 2.4时,可接受多个element参数。在低于2.4的Redis版本中,只能接受一个element参数
起始版本 : 2.2.0
时间复杂度 : 添加一个元素为O(1),添加多个元素为O(N),N为要添加的元素个数。
只有当 key 存在,而且对应的 value 是 list 类型的时候,才执行操做。
RPUSHX key 元素1 [元素2 ...]
推入元素后列表的长度
redis 版本 >= 4.0时,可接受多个element参数。在低于4.0的Redis版本中,只能接受一个element参数。
起始版本 : 1.0.0
时间复杂度 : O(1)
删除(弹出)最左端的元素
当list中没有元素时(好比元素都被弹出),key 会被删除
LPOP key
弹出元素的值,当key不存在时,返回nil
起始版本 : 1.0.0
时间复杂度 : O(1)
删除(弹出)最右端的元素
当list中没有元素时(好比元素都被弹出),key 会被删除
RPOP key
弹出元素的值,当key不存在时,返回nil,当list中没有元素时,返回null
起始版本 : 1.0.0
时间复杂度 : O(N),其中N是要遍历才能到达索引处元素的元素数。
索引从0开始,支持负索引,-1末尾最后一个元素
LINDEX key index
索引处的元素,索引越界,返回null
起始版本 : 2.2.0
时间复杂度 : O(N),其中N是要遍历才能到达插入点的元素数量,这意味着最左端的元素为O(1)
list 存在多个相同的目标元素时,从左往右选择第一个。
LINSERT key BEFORE|AFTER 目标元素 value
目标元素为 value 的插入点,BEFORE、AFTER 指定在目标元素的先后插入
插入操做后的list长度,当目标元素找不到时,返回 -1。
起始版本 : 1.0.0
时间复杂度 : O(S + N) 其中 S 是小列表到 HEAD 的起始偏移量,大列表到最近的头 (HEAD或TAIL) 的起始偏移量,N 是指定范围内的元素数。
范围获取元素,下标从0开始,支持负下标,-1表示最右端的元素,包括开始下标,也包括结束下标
超出范围的索引不会产生错误。
若是开始下标大于列表的末尾,则返回一个空列表。
若是结束下标大于列表的实际末尾,则Redis会将其视为列表的最后一个元素。
LRANGE key 开始下标 结束下标
范围内的元素列表
起始版本 : 2.2.0
时间复杂度 : O(1)
LLEN key
起始版本 : 2.2.0
时间复杂度 : O(N+M),其中N是列表的长度,M是删除的元素数。
从列表中删除 count 个 value 元素。
好比, LREM list -2 “hello”
会从存于 list 的列表里移除最后两个出现的 “hello”。
须要注意的是,若是list里没有存在key就会被看成空list处理,因此当 key 不存在的时候,这个命令会返回 0。
LREM key count 元素
已删除元素的数量。
起始版本 : 1.0.0
时间复杂度 : O(N),其中N是列表的长度。将列表的第一个或最后一个元素设置为O(1)。
更新指定下标的值, 当index超出范围时会返回一个error。
下标从0开始,支持负下标,-1表示最右端的元素
LSET key index 新值
ok
起始版本 : 1.0.0
时间复杂度 : O(N),其中N是要由操做删除的元素数。
下标从0开始,支持负下标,-1表示最右端的元素,包括开始下标,也包括结束下标
例若有一个 list [01234]
LTRIM list 1 -2
的结果为 [123]
超出范围的索引不会产生错误:若是开始下标大于列表的末尾或 开始下标大于结束下标,结果将是一个空列表(空列表将致使key被删除)。
若是 结束下标 大于列表的末尾,则Redis会将其视为列表的最后一个元素。
LTRIM与LPUSH / RPUSH共同使用。例如:
LTRIM key 开始下标 结束下标
ok
就想它的名称同样 R POP L PUSH,做用是将第一个 list 的最右端元素弹出,推入到 第二list的最左端,这个操做是原子行的。
咱们称弹出元素的 list 为源list,推入元素的 list 为目标list
若是 源list 不存在,那么会返回 nil 值,而且不会执行任何操做。
若是 源list 和 目标list 存在,那么这个操做等同于移除列表最后一个元素而且把该元素放在列表头部, 因此这个命令也能够看成是一个旋转列表的命令。
RPOPLPUSH 源list 目标list
弹出的元素
BRPOPLPUSH
是RPOPLPUSH
的阻塞版。
当 源list 存在元素时,此命令的行为与RPOPLPUSH
彻底相同。
在MULTI / EXEC块中使用时,此命令的行为与RPOPLPUSH彻底相同。
当 源list 为空时,Redis 将阻止链接,直到另外一个客户端将元素推入源list或超时到达为止。
有关更多信息,请参见RPOPLPUSH。
BRPOPLPUSH 源list 目标list timeout
timeout 是发生阻塞时的超时时间,单位秒。若是想一种阻塞下去,须要设置为 0。
弹出的元素,若是超时,返回null
起始版本 : 2.0.0
时间复杂度 : O(1)
(阻塞式)删除(弹出)最左端的元素
BLPOP
是 LPOP
的阻塞版本。
二者区别
LPOP
:key 对应的 value 中没有元素时,返回 nullBLPOP
:key 对应的 value 中没有元素时,一直阻塞,直到 value 中有元素或超时。除了上面的区别之外, BLPOP
命令还支持了多个 key
。 当给定多个 key 时,按参数 key 的前后顺序依次检查各个列表,弹出第一个非空列表的最左端元素。
BLPOP key1 [key2] timeout
timeout 是发生阻塞时的超时时间,单位秒。若是想一种阻塞下去,须要设置为 0。
BLPOP
命令不是全部状况下都会被阻塞
只要指定的 key 列表中有一个不为null,就不会被阻塞,而是返回该key和弹出的元素。若是有多个 key 都不为 null,依次从作往右,找到第一个不为null的,而后返回
例如
BLPOP list1 list2 list3 0
假设 list1 为 null。 list二、list3 不为 null。则, 返回 list2 中最左端的元素(由于它是从 list1 –> list2 –> list3 这个顺序查起的第一个非空列表)。
若是全部给定的 key 都不存在或都为空列表,那么 BLPOP
命令将阻塞链接, 直到有另外一个客户端给其中的某一个 key 添加了元素为止。
一旦有新的数据出如今其中一个 key 中,那么BLPOP
命令会解除阻塞状态,而且返回该 key 和弹出的元素值。
若是有多个客户端都在执行 BLPOP
命令。若是这些客户端指定的 key 没有重叠的状况,那还好说,至关于单个客户端执行 BLPOP
命令。但若是指定的 key 有重叠的时,操做的前后循序是什么?
客户端A 、客户端 B 调用的 BLPOP
命令中包含相同的 key,可是该 key 的 元素足够多(>2),此时客户端A 、客户端 B都不会阻塞
客户端A 、客户端 B 调用的 BLPOP
命令中包含相同的 key,可是该 key 的 元素只要1个,此时先来后到,先执行命令的客户端返回,后执行命令的客户端阻塞
客户端A 、客户端 B 调用的 BLPOP
命令中包含相同的 key,可是该 key 没有元素,客户端A 、客户端 B 一直阻塞,直到有元素为止。
存在元素后,阻塞时间最长尚未超时的客户端优先执行。
解除阻塞后,若是该客户端又执行了该命令,须要从新排队。
上面说的都是多个客户端阻塞同一个key的状况,再看下,同一个客户端阻塞多个key的状况
当一个客户端同时被多个 key 阻塞时,若多个 key 的元素同时可用(多是由于事务或者某个Lua脚本向多个list添加元素), 那么客户端会解除阻塞,并使用第一个接收到 push 操做的 key(假设它拥有足够的元素为咱们的客户端服务,由于有可能存在其余客户端一样是被这个key阻塞着)。
从根本上来讲,在执行完每一个命令以后,Redis 会把一个全部 key 都得到数据而且至少使一个客户端阻塞了的 list 运行一次。 这个 list 按照新数据的接收时间进行整理,便是从第一个接收数据的 key 到最后一个。在处理每一个 key 的时候,只要这个 key 里有元素, Redis就会对全部等待这个key的客户端按照“先进先出”(FIFO)的顺序进行服务。若这个 key 是空的,或者没有客户端在等待这个 key, 那么将会去处理下一个从以前的命令或事务或脚本中得到新数据的 key,如此等等。
BLPOP
阻塞时,key 有可能同时接收到多个元素,例如
LPUSH mylist a b c
当多个元素被推入key中时,BLPOP
在 Redis 2.4和Redis 2.6或更高版本的行为会有所不一样。
对于Redis 2.6,阻塞的客户端须要等到其余客户端所有push完以后才开始解除阻塞
Client A: BLPOP foo 0
Client B: LPUSH foo a b c
复制代码
若是以上状况是在 Redis 2.6服务器或更高版本的服务器上发生的,则客户端A将返回C,由于在LPUSH命令以后,列表包含c,b,a了该元素,所以从左侧获取元素就意味着要返回c。
相反,Redis 2.4的工做方式不一样:在推送操做的上下文中为阻塞客户端提供服务。所以,只要LPUSH foo a b c开始将第一个元素a推送到list中,阻塞客户端就会当即解除阻塞并返回a
在将数据复制或持久存储到AOF文件中时,Redis 2.4的行为会产生不少问题,所以Redis 2.6中引入了更为通用和语义上更简单的行为来防止出现问题。
请注意,出于相同的缘由,Lua脚本或MULTI/EXEC块可能会将元素推入列表,而后再删除列表。在这种状况下,只要在执行单个命令,事务或脚本以后list中没有数据,就彻底不会为被阻止的客户端提供服务,而且将继续被阻止。
能够利于 BLPOP
的特性,用 Redis 的 list 实现消息队列。
BLPOP 就至关于一个监听器,监听 list 中的消息,有数据就返回,没有就一直监听
起始版本 : 2.0.0
时间复杂度 : O(1)
(阻塞式)删除(弹出)最右端的元素
BRPOP
与 BLPOP
语法、返回值、实现细节都相同,惟一的区别就是一个是右端弹出一个是左端弹出
相关的细节参考 BLPOP
命令
BRPOP key1 [key2] timeout
timeout 是发生阻塞时的超时时间,单位秒。若是想一种阻塞下去,须要设置为 0。