rpush 向list中添加元素
127.0.0.1:6379> rpush mylist a b c d e #如果列表不存在,一个空列表会被创建并执行 rpush 操作
(integer) 5 #返回list的元素个数
lpush将一个或多个值插入到列表头部
127.0.0.1:6379> lpush mylist a b c d e
127.0.0.1:6379> lrange mylist 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
lrange 返回指定下标范围的数组元素
#区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
lpop 从左边(头部)开始弹出list元素
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> lpop mylist 2 #2表示弹出的个数,如果不写个数,默认弹出1个
1) "a"
2) "b"
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "d"
3) "e"
4) "f"
5) "g"
rpop 从右边(末尾)开始弹出list元素
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> rpop mylist
"e"
127.0.0.1:6379> rpop mylist 2 #2表示弹出的个数,如果不写个数,默认弹出1个
1) "d"
2) "c"
lset 按索引位置设置list的值
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lset mylist 1 X #lset mylist index element
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "X"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lset mylist 8 X #超过索引,报错
(error) ERR index out of range
linsert 在list中某个现存元素的之前或之后插入值
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> linsert mylist before d X #在d的前面插入X
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "X"
5) "d"
6) "e"
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "X"
5) "d"
6) "e"
127.0.0.1:6379> linsert mylist after d Y #在d的后面插入Y
(integer) 7
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "X"
5) "d"
6) "Y"
7) "e"
rpushx 类似rpush,rpushx是当list不存在的时候,则不会创建list
127.0.0.1:6379> rpush mylist a b c d e
(integer) 5
127.0.0.1:6379> keys *
1) "mylist"
127.0.0.1:6379> rpushx mylist2 a b c d e #mylist2不存在,不会创建list,添加失败。
(integer) 0
127.0.0.1:6379> keys *
1) "mylist"
127.0.0.1:6379> rpushx mylist f g h #mylist存在,则在存在的list后面加入新的元素,类似rpush,在尾部插入。
(integer) 8
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
8) "h"
lpushx 类似lpush,lpushx是当list不存在的时候,则不会创建list
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lpushx mylist f g h #mylist存在,则在存在的list后面加入新的元素,类似lpush,在头部插入。
(integer) 8
127.0.0.1:6379> lrange mylist 0 -1
1) "h"
2) "g"
3) "f"
4) "a"
5) "b"
6) "c"
7) "d"
8) "e"
127.0.0.1:6379> lpushx mylist2 f g h #mylist2不存在,不会创建list,添加失败。
(integer) 0
127.0.0.1:6379> keys *
1) "mylist"
ltrim,保留指定索引区间内的元素,其余的不保留
#对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
#下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ltrim mylist 1 3 #保留索引 1---3 的元素
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "c"
3) "d"
llen,输出list长度,如果不是list类型,则报错
127.0.0.1:6379> set str1 hello,world
OK
127.0.0.1:6379> keys *
1) "str1"
2) "mylist"
127.0.0.1:6379> llen mylist
(integer) 5
127.0.0.1:6379> llen str1
(error) WRONGTYPE Operation against a key holding the wrong kind of value #针对持有错误类型值的键的错误类型操作
lrem,删除list中指定数量的元素
根据参数 count 的值,移除列表中与参数 value 相等的元素。
count 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
127.0.0.1:6379> rpush mylist a b b c b e f f b g f c f g
(integer) 14
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "b"
4) "c"
5) "b"
6) "e"
7) "f"
8) "f"
9) "b"
10) "g"
11) "f"
12) "c"
13) "f"
14) "g"
127.0.0.1:6379> lrem mylist 3 b #从头部开始,删除3个b
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "c"
3) "e"
4) "f"
5) "f"
6) "b"
7) "g"
8) "f"
9) "c"
10) "f"
11) "g"
127.0.0.1:6379> lrem mylist -3 f #从尾部开始,删除3个f
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "c"
3) "e"
4) "f"
5) "b"
6) "g"
7) "c"
8) "g"
127.0.0.1:6379> lrem mylist 0 c #删除list中所有的c
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "e"
3) "f"
4) "b"
5) "g"
6) "g"
rpoplpush 弹出一个list的最后一个元素,然后添加到另一个list中
127.0.0.1:6379> keys *
1) "source"
127.0.0.1:6379> lrange source 0 -1
1) "x"
2) "y"
3) "z"
127.0.0.1:6379> rpoplpush source destination 弹出source的最后一个元素z,添加到destination中
"z"
127.0.0.1:6379> keys *
1) "destination"
2) "source"
127.0.0.1:6379> lrange source 0 -1
1) "x"
2) "y"
127.0.0.1:6379> lrange destination 0 -1
1) "z"
blpop 弹出list中第一个元素,如果list不存在,需要等待超时时间,超时时间过后,如果list中依旧没有元素,则返回空
127.0.0.1:6379> rpush list a b c d e
(integer) 5
127.0.0.1:6379> keys *
1) "list"
127.0.0.1:6379> blpop list1 list2 5 #不存在list1 和 list2 5秒之后超时
(nil)
(5.04s)
如果此时在超时时间内,在另外的客户端,向不存在的list中加入元素,则可以马上在原来等待超时的客户端弹出按照规定(blpop,brpop)加入的元素。
初始状态:不存在list1,list2,在会话1中准备弹出元素,10秒超时,会话2准备给list1加入元素
弹出状态:先执行会话1,弹出元素,发现list1和list2为空,不存在,等待超时时间;在超时时间内(过了4.07s),在会话2中执行:向list1中加入元素,会话1会立即弹出刚刚在会话2中加入的元素
同理:brpop
也是一样,只是弹出的是最后一个元素而已。
总结:blpop
和brpop
都能接受多个list,但是比如:blpop list1 list2 list3
,规则是会从左往右开始查找list1->list2->list3
如果找到了一个存在且不为空的list,则弹出元素即可,如果所有list都不存在,则开始等待超时,如果在超时时间内,向其中的一个或者多个list加入了元素,则还是开始list1->list2->list3
这样的规则。
brpoplpush 类似rpoplpush,只是多了超时时间
先执行会话1,发现source不存在,等待超时20s,但是在4.18s的时候,执行会话2,会话1发现source中有了元素,则开始执行弹出并加入到destination中。