rpush 向list中添加元素

rpush.png

127.0.0.1:6379> rpush mylist a b c d e    #如果列表不存在,一个空列表会被创建并执行 rpush 操作
(integer) 5                               #返回list的元素个数

lpush将一个或多个值插入到列表头部

lpush.png

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元素

lpop.png

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元素

rpop.png

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中加入的元素

弹出状态.png

同理:brpop也是一样,只是弹出的是最后一个元素而已。
总结:blpopbrpop都能接受多个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中。