redis的第三种数据结构 list

前几篇文章介绍了redis的stringhash,今天讲一下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 约等于 消息队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值