目录
LINDEX 获取指定下标元素
LINDEX key index:返回列表 key 中,下标为 index 的元素。
- index可以是正数:0为第一个,1为第二个,以此类推
- index可以是负数:-1为最后一个,-2为倒数第二个元素,以此类推
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> lpush mylist banana
(integer) 2
127.0.0.1:6379> lpush mylist orange
(integer) 3
127.0.0.1:6379> lpush mylist pear
(integer) 4
# 0取第一个
127.0.0.1:6379> lindex mylist 0
"pear"
# -1取最后一个
127.0.0.1:6379> lindex mylist -1
"apple"
127.0.0.1:6379> lindex mylist 20
(nil)
时间复杂订为O(N),N为下标index经过的元素数量。
返回值
- 返回列表下标为index位置的值
- 若index不在列表的区间范围内,返回nil
LSET 指定下标添加元素
LSET key index value:将列表 key 下标为 index 的元素的值设置为 value。
- 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误
- key必须存在
127.0.0.1:6379> flushdb
OK
# key不存在
127.0.0.1:6379> lset mylist 0 apple
(error) ERR no such key
# 初始化key 并插入值
127.0.0.1:6379> lpush mylist app
(integer) 1
127.0.0.1:6379> lindex mylist 0
"app"
# 用lset
127.0.0.1:6379> lset mylist 0 apple
OK
127.0.0.1:6379> lindex mylist 0
"apple"
时间复杂度为O(N)
- 表头和表尾,复杂度为O(1)
- 其它情况为O(N),N为列表的长度
返回值
- 成功返回OK,否则返回错误信息
LPUSH 将元素插入列表头
LPUSH key value [value ...]:将一个或多个值 value 插入到列表 key 的表头
- 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头
- 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作
- 当 key 存在但不是列表类型时,返回一个错误
- 允许重复插入
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4
# 重复插入
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 8
# 查看列表数据
127.0.0.1:6379> lrange mylist 0 -1
1) "pear"
2) "orange"
3) "banana"
4) "apple"
5) "pear"
6) "orange"
7) "banana"
8) "apple"
时间复杂度为O(1)。
返回执行LPUSH后的列表长度。
LPUSHX
LPUSHX key value:将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。
- 和 LPUSH相似, 不同的是,当 key 不存在时, LPUSHX 命令什么也不做
127.0.0.1:6379> flushdb
OK
# mylist不存在
127.0.0.1:6379> lpushx mylist apple banana orange pear
(integer) 0
# 初始化mylist
127.0.0.1:6379> lpush mylist apple
(integer) 1
# lpushx操作
127.0.0.1:6379> lpushx mylist apple banana orange pear
(integer) 5
# 查看mylist数据
127.0.0.1:6379> lrange mylist 0 -1
1) "pear"
2) "orange"
3) "banana"
4) "apple"
5) "apple"
时间复杂度为O(1)。
返回执行LPUSHX后的列表长度。
RPUSH 将元素插入列表尾
RPUSH key value [value ...]
- 操作与LPUSH相似,只有一点不同是 RPUSH 是从尾部插入(LPUSH从头插入)
RPUSHX
RPUSHX key value
- 操作与LPUS X相似,只有一点不同是 RPUSHX 是从尾部插入(LPUSHX从头插入)
LINSERT 将元素插入列表某位置之前
LINSERT key BEFORE|AFTER pivot value:将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
- 当 pivot 不存在于列表 key 时,不执行任何操作
- 当 key 不存在时, key 被视为空列表,不执行任何操作
- 如果 key 不是列表类型,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple
(integer) 1
# 插入到apple之前
127.0.0.1:6379> linsert mylist before apple banaba
(integer) 2
# 插入到apple
127.0.0.1:6379> linsert mylist after apple banaba
(integer) 3
# pivot不存在
127.0.0.1:6379> linsert mylist after pear banaba
(integer) -1
# 清空列表
127.0.0.1:6379> lpop mylist
"banaba"
127.0.0.1:6379> lpop mylist
"apple"
127.0.0.1:6379> lpop mylist
"banaba"
127.0.0.1:6379> lpop mylist
(nil)
# key为空或key不存在
127.0.0.1:6379> linsert mylist before apple banana
(integer) 0
127.0.0.1:6379> linsert mylist1 before apple banana
(integer) 0
时间复杂度O(N), N 为寻找 pivot 过程中经过的元素数量
返回执行后的列表长度
- 若没有找到 pivot ,返回 -1
- 若key 不存在或为空列表,返回 0
LLEN 列表长度
LLEN key:返回列表长度。
- 若 key 不存在,则 key 被解释为一个空列表,返回 0
- 若 key 不是列表类型,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4
127.0.0.1:6379> llen mylist
(integer) 4
时间复杂度O(1)。
返回列表 key 的长度。
LPOP 取列表头元素
LPOP key:移除并返回列表 key 的头元素。
- 若列表为空,返回nil
- 若key不存在,返回nil
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4
127.0.0.1:6379> llen mylist
(integer) 4
127.0.0.1:6379> lpop mylist
"pear"
# 头元素已不存在
127.0.0.1:6379> lrange mylist 0 -1
1) "orange"
2) "banana"
3) "apple"
127.0.0.1:6379> lpop mylist
"orange"
127.0.0.1:6379> lpop mylist
"banana"
127.0.0.1:6379> lpop mylist
"apple"
# 列表为空 或 key不存在时
127.0.0.1:6379> lpop mylist
(nil)
127.0.0.1:6379> lpop mylist1
(nil)
时间复杂度为O(1)。
返回移除的头元素
- 若列表为空 或 key不存在时,返回nil
RPOP 取列表尾元素
RPOP key:操作与LPOP相似
- RPOP是从尾部移除,LPOP是从头部移除
BLPOP 阻塞式取列表头元素
BLPOP key [key ...] timeout:列表的阻塞式(blocking)弹出原语
- timeout单位为秒,若为0 表示无限阻塞
- 它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止
- 当给定多个 key 参数至少有一个不为空列表,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple # 初始化列表并添加一个元素
(integer) 1
127.0.0.1:6379> blpop mylist 10
1) "mylist"
2) "apple"
127.0.0.1:6379> blpop mylist 10
(nil)
(10.05s) # 超时秒数,未取出数据退出
127.0.0.1:6379> lpush mylist apple # 添加一个元素
(integer) 1
# 而mylist2不存在 跳过;mylist存在且不为空,紧接着 command 列表的第一个元素被弹
127.0.0.1:6379> blpop mylist2 mylist 10
1) "mylist" # 弹出元素所属的列表
2) "apple" # 弹出元素所属的值
- 所给的key为空 或不存在,命令将阻塞连接
- 直到等到超时退出
- 或直到任何一个key有值为止
- 多客户端执行相同命令时,多个客户端先后放到同一个阻塞队列中,某个key有数据时,先放入阻塞队列的客户端先获取元素
- 在MULTI/EXEC事务的BLPOP中
- 事务行为为了保证事务的原子性,是阻止对key进行push操作的,所以在MULTI/EXEC事务中BLPOP与LPOP一样不会阻塞,对空列表返回nil,对非空列表返回头元素
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> multi # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000 # 对不存在key进行blpop
QUEUED
127.0.0.1:6379(TX)> exec # 提交事务
1) (nil) # 不阻塞立即返回
127.0.0.1:6379> lpush mylist apple # 创建mylist并初始化一个元素
(integer) 1
127.0.0.1:6379> multi # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000 # 对非空列表进行blpop
QUEUED
127.0.0.1:6379(TX)> exec # 提交事务
1) 1) "mylist" # 返回元素所在的列表
2) "apple" # 返回元素
127.0.0.1:6379> multi # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000 # 对空列表进行blpop
QUEUED
127.0.0.1:6379(TX)> exec # 提交事务
1) (nil) # 不阻塞直接返回nil
时间复杂度为o(1)。
返回
- 返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值
- 如果列表为空,返回一个 nil
BRPOP 阻塞式取列表尾元素
BRPOP key [key ...] timeout:操作与BLPOP相似
- 不同点:BRPOP是取第一个非空列表的尾部元素;BLPOP是取第一个非空列表的头部元素。
RPOPLPUSH 取尾元素插入头部
RPOPLPUSH source destination:在一个原子时间内,执行以下两个动作
- 取出source尾元素,并返回给客户端
- 从source取出的元素插入到destination列表的头部
127.0.0.1:6379> flushdb
OK
# source和dectination均不存在
127.0.0.1:6379> rpoplpush mylist mylist2
(nil)
# 初始化一个列表 添加一个元素
127.0.0.1:6379> lpush mylist banana
(integer) 1
127.0.0.1:6379> rpoplpush mylist mylist2
"banana"
127.0.0.1:6379> lrange mylist2 0 -1 # 从mylist中出放入到了mylist2
1) "banana"
127.0.0.1:6379> lrange mylist 0 -1 # 已取出,mylist为空列表
(empty array)
127.0.0.1:6379> lpush mylist apple # mylist再插入元素
(integer) 1
127.0.0.1:6379> rpoplpush mylist mylist2 # 再执行一次rpoplpush
"apple"
127.0.0.1:6379> lrange mylist2 0 -1 # 打印mylist2 证实是插入到表头
1) "apple"
2) "banana"
127.0.0.1:6379> rpoplpush mylist mylist2 # mylist为空时执行 rpoplpush 返回nil
(nil)
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> rpoplpush mylist age # mylist为空,不管destination是什么数据结构,返回nil
(nil)
127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> rpoplpush mylist age # mylist非空,destination是字符串,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> rpoplpush age mylist2 # age非队列,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(1)。
返回:(RPOPLPUSH是先rpop 再 lpush)
- source为空队列或source不存在时,返回nil(只执行rpop,不执行lpush)
- source为非空队列,且destination不存在或为队列,返回source的尾元素,并插入到destination中(destination不存在就创建一个队列,执行rpop和lpush)
- source存在且不是队列 或 source非空队列且destination不是队列,报错(对非队列key执行rpop)
BRPOPPUSH 阻塞取尾元素插入头元素
BRPOPLPUSH source destination timeout:是 RPOPLPUSH 的阻塞版本
- 若source为空,则阻塞,直到超时
- timeout以秒为单位,0表示无限超时
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> brpoplpush mylist mylist2 10 # source不存在或空队列,阻塞超时
(nil)
(10.09s)
127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> brpoplpush mylist mylist2 10 # source为非空队列,取出并lpush到mylist2中
"apple"
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> brpoplpush age mylist mylist2 10 # source不是队列
(error) ERR wrong number of arguments for 'brpoplpush' command
127.0.0.1:6379> brpoplpush mylist2 age 10 # source非空队列,dectination不是队列
(error) WRONGTYPE Operation against a key holding the wrong kind of value
- 阻塞期间有别的客户端插入元素
时间复杂度O(1)。
返回:
- source为空队列或source不存在时阻塞,直到超时返回nil 和 超时时间(只执行rpop,不执行lpush);或者有别的客户端向source 插入数据才返回元素 和 等待时间(执行rpop 和 lpush)
- source为非空队列,且destination不存在或为队列,返回source的尾元素,并插入到destination中(destination不存在就创建一个队列,执行rpop和lpush)
- source存在且不是队列 或 source非空队列且destination不是队列,报错(对非队列key执行rpop)
LRANGE 返回指定区间元素
LRANGE key start stop:返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定
- 0表示第一个元素,1表示第二个元素,以此类推
- -1表示最后一个元素,-2表示倒数第二个元素,以此类推
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> brpoplpush mylist mylist2 0
"banana"
(12.53s)
127.0.0.1:6379> lrange mylist2 0 -1
1) "banana"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4
127.0.0.1:6379> lrange mylist 0 1
1) "pear"
2) "orange"
127.0.0.1:6379> lrange mylist -2 -1
1) "banana"
2) "apple"
127.0.0.1:6379> lrange mylist 1 0 # start 大于 stop
(empty array)
127.0.0.1:6379> lrange mylist -1 -2 # start 大于 stop
(empty array)
127.0.0.1:6379> lrange mylist 100 110 # start 大于列表长度
(empty array)
时间复杂度为O(S+N),S为偏移量 start , N 为指定区间内元素的数量。
返回:
- 若start 小于等于 stop,返回[start, stop] 区间的元素
- 若start 大于 stop,返回空列表
LREM 移除特定元素
LREM key count value:根据参数 count 的值,移除列表中与参数 value 相等的元素
- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
- count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
- count = 0 : 移除表中所有与 value 相等的值
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lrem mylist 0 apple
(integer) 0
127.0.0.1:6379> lpush mylist apple banana apple orange apple pear apple #插入4个apple
(integer) 7
127.0.0.1:6379> lrem mylist 2 apple # 移除2个apple
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1 # 还剩2个apple
1) "pear"
2) "orange"
3) "apple"
4) "banana"
5) "apple"
127.0.0.1:6379> lrem mylist 0 apple # 移除所有apple
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1 # 剩0 个apple
1) "pear"
2) "orange"
3) "banana"
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> lrem age 0 apple # 对非队列执行lrem
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(N), N 为列表的长度
返回:
- 被移除元素的数量
- 若key不存在,则key视为空列表,返回0
- 若key存在且不为列表,对非列表执行lrem报错
LTRIM 保留特定区间元素
LTRIM key start stop:只保留指定区间 [start, stop] 内的元素,不在指定区间之内的元素都将被删除
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ltrim mylist 0 5 # 不存在的key似为空列表
OK
127.0.0.1:6379> lpush mylist 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(integer) 15
127.0.0.1:6379> ltrim mylist 0 5 # 保存区间 [0, 5] 的元素
OK
127.0.0.1:6379> lrange mylist 0 -1 # 查看列表元素
1) "15"
2) "14"
3) "13"
4) "12"
5) "11"
6) "10"
127.0.0.1:6379> set age 22 # 对非列表执行ltrim
OK
127.0.0.1:6379> ltrim age 0 5 # 对非列表执行ltrim
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度为O(N),N 为被移除的元素的数量
返回:
- 对列表或不存在key执行ltrim,返回OK
- 对非列表执行ltrim,报错