Redis数据库部分命令

列表相关指令

关键字

用法

指令作用

blpop

blpop key [key…] time

从第一个列表key的第一个元素开始找到第一个非空的元素弹出(会阻塞线程)

brpop

brpop key [key…] time

从第一个列表key的最后一个元素开始找到第一个非空的元素弹出(会阻塞线程)

brpoplpush

brpoplpush key1 key2 time

从列表key1的最后一个元素开始找到第一个非空的元素弹出并将这个元素存储到key2中(会阻塞线程)

lindex

lindex key index

返回列表key中索引为index的元素

linsert

insert key before(after) oldvalue value

向列表key中的元素oldvalue前或后插入元素value

llen

llen key

返回列表key的长度

lpop

lpop key

弹出且返回列表key的第一个元素

lpush

lpush key value [value…]

向列表key的表头插入一个或者多个元素

lpushx

lpushx key value [value…]

当列表key存在且有值时,向列表key的表头插入一个或者多个元素

lrange

lrange key start end

查询列表key索引区间为start到end中所有的元素

lrem

lrem key num value

移除列表key中指定个数元素值等于value的元素

lset

lset key index value

将列表key中索引为index的元素值改为value

ltrim

ltrim key start end

保留start~end索引范围内的元素

rpop

rpop key

移除列表key的最后一个元素

rpoplpush

rpoplpush key1 key2

将key1中最后一个元素弹出返回,并将此元素插入key2的表头

rpush

rpush key value [value…]

向列表key的尾部依次添加一个或多个元素

rpushx

rpushx key value [value…]

当列表key存在且有值时,向列表key的尾部依次添加一个或多个元素

blpop

语法:

blpop key [key ... ] time

作用:

只有一个列表key时:
1、如果列表key中有内容,则会弹出第一个元素;
2、如果列表key为空时,会等待time(秒),此时会阻塞线程,直到key中有新的元素加入后将其弹出,或者时间到为止。
有多个列表key时:
1、如果列表key中都有内容时,会从第一个key开始寻找,找到第一个元素弹出;
2、如果前面的列表key中没有值,则会向后面的key继续寻找,直到找到第一个元素后将其弹出;
3、如果所有的列表key中都没有值,则会在查询一遍后停止阻塞线程,直到其中任意一个列表key中有值加入后将其弹出或者等待时间结束。
注意:当time设置为0时,表示等待时间为无限长!(后面的有等待时长的将不再说明)

示例:

# 只有一个列表key,且有值的时候:
127.0.0.1:6379> lrange list1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> blpop list1 3
1) "list1" 	# 弹出元素所在列表key
2) "e"		#弹出的元素

# 只有一个列表key,且没有元素的时候:
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)
127.0.0.1:6379> blpop list1 5
(nil)			# 没有值弹出
(5.04s)			#等待时长

# 有多个列表key,且都有值时:
127.0.0.1:6379> lpush list2 a
(integer) 1		# 向列表list2中添加元素'a'
127.0.0.1:6379> lpush list3 b
(integer) 1		# 向列表list3中添加元素'b'
127.0.0.1:6379> blpop list2 list3 5
1) "list2"
2) "a"

# 有多个列表key,且前面的key中没有值时:
127.0.0.1:6379> blpop list2 list3 5
1) "list3"
2) "b"

# 有多个列表key,且都没有值时:
127.0.0.1:6379> blpop list2 list3 5
(nil)
(5.11s)

brpop

语法:

brpop key [key ...] time

作用:

作用与blpop几乎一模一样,但是在查询的过程略有不同:
当只有一个列表key的时候,blpop是从列表key的第一个元素开始查找,而brpop是从列表key的最后一个元素开始查找;
当多个列表key的时候,blpop和brpop都是从第一个列表key开始查找,只是在被查找的列表key下进行查找元素时,blpop是从第一个元素开始,brpop是从最后一个元素开始;
两者的查找方式类似于栈和队列。
示例请参照blpop指令的示例。

brpoplpush

语法:

brpoplpush key1 key2 time

作用:

当列表key1中有元素时,会将列表key1中的最后一个元素取出,并将这个元素插入到列表key2中的第一位;
当列表key1中没有元素时,会阻塞线程,直达列表key1中有元素添加后被弹出或阻塞时间结束;
brpoplpush的实质作用相当于是brpop与lpush的结合,不过brpop作用于列表key1,lpush作用于列表key2.

示例:

# 当列表key1有元素,key2没有元素时:
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "b"
127.0.0.1:6379> brpoplpush list1 list2 2
"b"
127.0.0.1:6379> lrange list1 0 -1
1) "c"
127.0.0.1:6379> lrange list2 0 -1
1) "b"

# 当列表key1与key2都有元素时:
127.0.0.1:6379> brpoplpush list1 list2 2
"c"
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "b"

# 当列表key1没有元素时:
127.0.0.1:6379> brpoplpush list1 list2 2
(nil)
(2.02s)

lindex

语法:

lindex ley index

作用:

当列表key存在且索引没有越界时,返回索引index指向的元素;
当下标越界时,返回nil;
当key不是列表类型时,会报错。
注意:当key的类型为none,即key没有被定义时,返回的还是nil,不会报错。

示例:

127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "b"

# 当列表key存在且索引没有越界时:
127.0.0.1:6379> lindex list2 1
"b"

# 当下标越界时:
127.0.0.1:6379> lindex list2 3
(nil)

# 当key不是列表类型时:
127.0.0.1:6379> set key1 1
OK
127.0.0.1:6379> lindex key1 0
(error) WRONGTYPE Operation against a key holding the wrong kind of value

# 当key不是列表类型,但是没有被定义过时:
127.0.0.1:6379> type list1
none
127.0.0.1:6379> lindex list1 0
(nil)

linsert

语法:

linsert key before(after) oldvalue value

作用:

向列表key中的元素oldvalue前或后插入元素value,并且返回插入后的列表key的长度;
当列表key中的元素oldvalue不存在时,则插入失败,返回-1;
当列表key不存在(或者不是列表类型)时,则插入失败并且会报错。

示例:

# 当列表key与元素oldvalue都存在时:
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "b"
127.0.0.1:6379> linsert list2 before b 1
(integer) 3		# 在元素oldvalue前插入
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "1"
3) "b"
127.0.0.1:6379> linsert list2 after b 2
(integer) 4		# 在元素oldvalue后插入
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "1"
3) "b"
4) "2"

# 当列表key存在但元素oldvalue不存在时:
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "b"
127.0.0.1:6379> linsert list2 before a 1
(integer) -1
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "b"

# 当列表key不存在或不是列表类型时:
127.0.0.1:6379> type list1
none
127.0.0.1:6379> linsert list1 brfore a 1
(error) ERR syntax error

llen

语法:

llen key

作用:

当列表key存在且有值时,返回key的长度(即key中元素个数);
当key不存在,但不是列表以外其他类型时,返回0;
当key为列表以外的其他类型时,返回一个错误。

示例:

# 当列表key存在且有值时:
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "b"
127.0.0.1:6379> llen list2
(integer) 2

# 当key不存在,但不是列表以外其他类型时:
127.0.0.1:6379> type list1
none
127.0.0.1:6379> llen list1
(integer) 0

# 当key为列表以外其他类型时:
127.0.0.1:6379> set key1 a
OK
127.0.0.1:6379> llen key1
(error) WRONGTYPE Operation against a key holding the wrong kind of value

lpop

语法:

lpop key

作用:

当列表key存在且有值时,弹出并返回key中的第一个元素;
当列表key中没有值时,会返回nil;
当key不是列表类型时,会报错。

示例:

# 当列表key存在且有值时:
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "b"
127.0.0.1:6379> lpop list2
"c"
127.0.0.1:6379> lrange list2 0 -1
1) "b"

# 当key没有值时:
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)
127.0.0.1:6379> lpop list1
(nil)

# 当key不是列表类型时:
127.0.0.1:6379> lpop key1
(error) WRONGTYPE Operation against a key holding the wrong kind of value

lpush

语法:

lpush key value [value ...]

作用:

当列表key存在且有值时:
1、如果value只有一个,则直接插入到key的表头;
2、如果value有多个时,则会按照先后顺序一个一个插入到key的表头,最后插入的元素为表头;
当key不存在但是不是列表以外的类型时,会先创建一个列表:
1、如果value只有一个,则直接插入到key的表头;
2、如果value有多个时,则会按照先后顺序一个一个插入到key的表头,最后插入的元素为表头;
当key为列表以外的类型时,会返回一个错误。

示例:

# 当列表key存在且有值时:
127.0.0.1:6379> lrange list2 0 -1
1) "b"
127.0.0.1:6379> lpush list2 a
(integer) 2		# 只插入一个值
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "b"
127.0.0.1:6379> lpush list2 1 2 3
(integer) 5		# 同时插入多个值
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "2"
3) "1"
4) "a"
5) "b"

# 当key不存在但不是列表以外类型时:
127.0.0.1:6379> type list1
none
127.0.0.1:6379> lpush list1 a b
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1) "b"
2) "a"

# 当key为列表以外的类型时:
127.0.0.1:6379> type key1
string
127.0.0.1:6379> lpush key1 1
(error) WRONGTYPE Operation against a key holding the wrong kind of value

lpushx

语法:

lpushx key value [vlaue ...]

作用:

lpushx与lpush的功能相似,但是lpushx当且仅当列表key存在且有值的时候才能向key的表头插入元素;
当key不存在但不是列表以外类型时,不会进行操作,且返回0;
当key为列表以外类型时,会报错。

示例:

当列表key存在且有值时:
127.0.0.1:6379> lrange list1 0 -1
1) "a"
127.0.0.1:6379> lpushx list1 1 2 3
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "1"
4) "a"

# 当key不存在且不是列表以外类型时:
127.0.0.1:6379> type list1
none
127.0.0.1:6379> lpushx list1 1 2 3
(integer) 0
127.0.0.1:6379> lrange list1 0 -1
(empty list or set)

# 当key为列表以外类型时:
127.0.0.1:6379> type key1
string
127.0.0.1:6379> lpushx key1 1 2 3
(error) WRONGTYPE Operation against a key holding the wrong kind of value

lrange

语法:

lrange key start end

作用:

当列表key存在且有值时:
1、下标start、end没有越界,返回索引区间为start到end的所有元素;
2、下标start、end越界时,不会报错,如:end值大于列表长度减1时,会从start开始将后面所有的元素返回;
3、当start=0,end=-1时,会将列表key的所有元素返回;
当key不存在但不是列表以外的类型时,会返回0;
当key为列表以外的类型时,会报错。
注意:lrange的取值区间与编程语言略有不同,比如start=0,end=3时,会将索引为0~3的所有元素返回,即返回4个元素,是一个闭区间!

示例:

# 当列表key存在且有值时:
127.0.0.1:6379> lrange list2 0 2
1) "3"			# 索引在key中间
2) "2"
3) "1"
127.0.0.1:6379> lrange list2 0 -1
1) "3"			# 返回key的所有元素
2) "2"
3) "1"
4) "a"
5) "b"
127.0.0.1:6379> lrange list2 2 100
1) "1"			# 索引越界
2) "a"
3) "b"

lrem

语法:

lrem key num value

作用:

当列表key存在且有值时,根据num的值,在列表key中查询值等于value的元素进行移除,num值决定了移除的数量;
当列表key中不存在等于value值的元素时,就不会有任何移除操做,但会返回已移除的元素数目;
当num值大于列表中值等于value的元素时,会将key中所有值等于value的元素移除,并返回移除数量;
当key中没有值,并且key不是列表以外的类型时,返回0;
当key是列表以外的类型时,会报错。
注意:
num > 0时,移除时从表头开始查找;
num < 0时,移除时从表尾开始查找;
num = 0时,移除表中所有值等于value的元素。

示例:

# 当列表存在且有值:
127.0.0.1:6379> lpush list1 1 2 3 1 1 2 3
(integer) 7
127.0.0.1:6379> lrem list1 2 1
(integer) 2		# 移除的数量小于表中存在的数量,num > 0,从表头开始查
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lrem list1 -1 2
(integer) 1		# num < 0时,从表后开始查
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "3"
4) "1"
127.0.0.1:6379> lrem list1 0 1
(integer) 1		# num = 0时,移除所有对应元素
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "3"
127.0.0.1:6379> lrem list1 10 3
(integer) 2		# num大于只等于value的元素数目时,删除所有对应的元素
127.0.0.1:6379> lrange list1 0 -1
1) "2"

当key不存在但不是列表以外类型时:
127.0.0.1:6379> type list2
none
127.0.0.1:6379> lrem list2 1 1
(integer) 0

当key是列表以外类型时:
127.0.0.1:6379> set key1 1
OK
127.0.0.1:6379> lrem key1 1 1
(error) WRONGTYPE Operation against a key holding the wrong kind of value

lset

语法:

lset key index value

作用:

当列表key存在且有值时,会将索引为index的元素值更改为value,并返回ok;
当index超出索引范围,或者key为空时,会报错。

示例:

127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "b"
3) "a"

# 当列表key存在有值,且index在范围内时:
127.0.0.1:6379> lset list1 1 d
OK
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "d"
3) "a"

# 当index超出范围时:
127.0.0.1:6379> lset list1 10 1
(error) ERR index out of range

# 当key为空时:
127.0.0.1:6379> lrange list2 0 -1
(empty list or set)
127.0.0.1:6379> lset list2 2 0
(error) ERR no such key

ltrim

语法:

ltrim key start end

作用:

当列表key存在且有值时,如果start~end索引范围在key以内,则会将索引范围以外的所有元素移除,仅保留索引范围内的值,并返回ok;
当索引的范围大于key的范围时,将不会有任何操作,仅返回ok;
当key不是列表类型时,会报错。
注意:start和end可以写负数。

示例:

127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "d"
3) "a"

# 当列表key存在且有值时:
127.0.0.1:6379> ltrim list1 0 100
OK			# 索引范围大于key下标的范围
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "d"
3) "a"
127.0.0.1:6379> ltrim list1 0 1
OK			# 索引范围在key下表哦范围内
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "d"

# 当key不是列表类型时:
127.0.0.1:6379> set key1 1
OK
127.0.0.1:6379> ltrim key1 0 1
(error) WRONGTYPE Operation against a key holding the wrong kind of value

rpop

语法:

rpop key

作用:

rpop方法与lpop方法相似,但两者移除元素的位置不一样。
当列表key存在且有值的时,会将列表key的最后一个元素移除,并将这个元素返回;
当key不存在但不是列表以外类型时,返回nil;
当key是列表以外类型时,会报错。

示例:

# 当列表key存在且有值时:
127.0.0.1:6379> lrange list1 0 -1
1) "c"
2) "d"
127.0.0.1:6379> rpop list1
"d"
127.0.0.1:6379> lrange list1 0 -1
1) "c"

# 当key不存在但不是列表以外类型时:
127.0.0.1:6379> type list2
none
127.0.0.1:6379> rpop list2
(nil)

# 当key不是列表类型时:
(nil)
127.0.0.1:6379> type key1
string
127.0.0.1:6379> rpop key1
(error) WRONGTYPE Operation against a key holding the wrong kind of value

rpoplpush

语法:

rpoplpush key1 key2

作用:

当列表key1存在且有值时,将key1的最后一个元素弹出返回,并将此元素插入key2的表头;
当key1为空且不是列表以外类型时,会返回nil后不会有任何操作;
当key1为列表以外类型时,会报错;
注意:当key1=key2时,则是将key1的最后欧一个元素放到表头,相当于列表的旋转操作。

示例:

# 当列表key1存在且有值时:
127.0.0.1:6379> rpoplpush list1 list2
"c"
127.0.0.1:6379> lrange list1 0 -1
1) "d"
2) "a"
3) "b"
127.0.0.1:6379> lrange list2 0 -1
1) "c"

# 当key1为空但不是列表以外类型时:
127.0.0.1:6379> type list3
none
127.0.0.1:6379> rpoplpush list3 list2
(nil)

# 当key1为列表以外类型时:
127.0.0.1:6379> set key1 1
OK
127.0.0.1:6379> rpoplpush key1 list2
(error) WRONGTYPE Operation against a key holding the wrong kind of value

# 当列表key1存在有值且key1=key2时(旋转操作):
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> rpoplpush list1 list1
"d"
127.0.0.1:6379> lrange list1 0 -1
1) "d"
2) "a"
3) "b"
4) "c"

rpush

语法:

rpush key value [value...]

作用:

rpush和lpush作用相似,但是rpush是从尾部添加,lpush是从头部添加;
当列表key存在且有值时,直接向列表key的尾部依次一个或多个添加元素;
当key不存在时,会先创建列表后向key的尾部依次添加一个或多个元素;
当key是列表以外的其他类型时,会报错。

示例:

# 当key不存在时:
127.0.0.1:6379> rpush list1 a b c
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
3) "c"

# 当key存在且有值时:
127.0.0.1:6379> rpush list1 1 2 3
(integer) 6
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
3) "c"
4) "1"
5) "2"
6) "3"

# 当key是列表以外类型时:
127.0.0.1:6379> set key1 1
OK
127.0.0.1:6379> rpush key1 1 2 3
(error) WRONGTYPE Operation against a key holding the wrong kind of value

rpushx

语法:

rpushx key value [value ...]

作用:

当且仅当列表key存在且有值的时候,向列表key的尾部依次添加一个或多个元素,并返回key的长度,与rpush相似;
当key不存在但不是列表以外类型时,操作无效,返回0;
当key是列表以外元素时,会报错。

示例:

# 当key不存在且不是列表以外类型时:
127.0.0.1:6379> rpushx list2 1 2 3
(integer) 0
127.0.0.1:6379> lrange list2 0 -1
(empty list or set)

# 当列表key存在且有值时:
127.0.0.1:6379> rpush list2 1
(integer) 1
127.0.0.1:6379> rpushx list2 2 3 4
(integer) 4
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"

# 当key为列表以外类型时:
127.0.0.1:6379> get key1
"1"
127.0.0.1:6379> rpushx key1 1
(error) WRONGTYPE Operation against a key holding the wrong kind of value