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