前几篇文章介绍了redis的string和hash,今天讲一下list。
list的命令基本都以L开头
1.从右边插入列表 rpush key value1 value2 …
> rpush list1 1 a 2
(integer) 3
2.从左边插入列表 lpush key value1 value2 …
> lpush list1 0 -1
(integer) 5
3. 查看列表 lrange key start stop
> lrange list1 0 -1
1) "-1"
2) "0"
3) "1"
4) "a"
5) "2"
> lrange list1 2 4
1) "1"
2) "a"
3) "2"
4. linsert key before|after pivot element
tips: pivot 支点;枢轴;中心点
> linsert list1 before a 1.5
(integer) 6
> lrange list1 0 -1
1) "-1"
2) "0"
3) "1"
4) "1.5"
5) "a"
6) "2"
> linsert list1 after a b
(integer) 7
> lrange list1 0 -1
1) "-1"
2) "0"
3) "1"
4) "1.5"
5) "a"
6) "b"
7) "2"
如果列表里面有2个a 会怎么样呢?
rpush list2 1 a 2 a 3
(integer) 5
> linsert list2 before a 1.5
(integer) 6
> lrange list2 0 -1
1) "1"
2) "1.5"
3) "a"
4) "2"
5) "a"
6) "3"
看来是从左往右,只对第一个a有效
5.左侧弹出一个元素 lpop key
> lpop list2
"1"
6.右侧弹出一个元素 rpop key
> rpop list2
"3"
7.删除指定个数的值 lrem key count element
count>0 从左到右删count个和element相等的值
count<0 从右到左删count个和element相等的值
count=0 删除所有和element相等的值
先准备数据
> rpush list3 1 a 2 a 3 a 4 a 5 a
(integer) 10
> rpush list4 1 a 2 a 3 a 4 a 5 a
(integer) 10
> rpush list5 1 a 2 a 3 a 4 a 5 a
(integer) 10
左到右删2个a:
> lrem list3 2 a
(integer) 2
> lrange list3 0 -1
1) "1"
2) "2"
3) "3"
4) "a"
5) "4"
6) "a"
7) "5"
8) "a"
右到左删2个a:
> lrem list4 -2 a
(integer) 2
> lrange list4 0 -1
1) "1"
2) "a"
3) "2"
4) "a"
5) "3"
6) "a"
7) "4"
8) "5"
删除所有和element相等的值
> lrem list5 0 a
(integer) 5
> lrange list5 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
8.切片,只保留start到stop(包含)之间的元素 ltrim key start stop
> ltrim list5 2 4
OK
> lrange list5 0 -1
1) "3"
2) "4"
3) "5"
9.获取指定索引的值 lindex key index
> lindex list5 -1
"5"
> lindex list5 -3
"3"
> lindex list5 0
"3"
10.获取列表长度 llen key
> llen list5
(integer) 3
11.设置指定索引处的值 lset key index element
> lset list5 2 33
OK
> lrange list5 0 -1
1) "3"
2) "4"
3) "33"
12.阻塞版rpop: brpop key timeout
先pop清空列表:
> lrange list5 0 -1
(empty array)
tips 当列表清空时,key也被自动删除了:
> exists list5
(integer) 0
当list中有元素时,马上返回:
> rpush list5 1
(integer) 1
> brpop list5 3
1) "list5"
2) "1"
当list中没有元素时,等待timeout秒后才返回:
> brpop list5 3
(nil)
(3.08s)
当list中没有元素且timeout为0时,一直阻塞,直到取到结果:
> brpop list5 0
1) "list5"
2) "setFromAnotherTerminal"
(95.95s)
13.阻塞版lpop: blpop key timeout
功能特性和上面的brpop一样。
14.rpoplpush source destination
将source列表末尾元素a弹出,将其加入destination列表头,并返回a
> rpush list1 1 2 3
(integer) 3
> rpush list2 4 5 6
(integer) 3
> rpoplpush list1 list2
"3"
> lrange list2 0 -1
1) "3"
2) "4"
3) "5"
4) "6"
如果source不存在,则立马返回nil,不再做其它的
> rpoplpush notexist list2
(nil)
> lrange list2 0 -1
1) "3"
2) "4"
3) "5"
4) "6"
如果source 和 destination 一样,则等同于旋转操作
> rpoplpush list2 list2
"6"
> lrange list2 0 -1
1) "6"
2) "3"
3) "4"
4) "5"
15.brpoplpush source destination
rpoplpush的阻塞版,功能一样
16.one more thing
同一侧的push和pop 约等于 栈
一侧push 另一侧 pop 约等于 队列
push 加 ltrim 可实现指定长度的队列
push 加 阻塞pop 约等于 消息队列