Redis数据结构之列表

Posted 即使再小的帆也能远航!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis数据结构之列表相关的知识,希望对你有一定的参考价值。

列表类型用来存储多个有序字符串,可以从两端进行插入(push)和弹出(pop)操作,获取指定范围的元素列表,获取指定索引的元素等

常用命令

添加

lpush:从左边插入元素

lpush key value1 value2 ...

rpush:从右边插入元素

rpush key value1 value2 ...

linsert:在某个元素前或后插入元素,返回列表长度

linsert key before|after pivot value

d元素前添加e元素

127.0.0.1:6379[2]> rpush list a b c d
(integer) 4
127.0.0.1:6379[2]> linsert list before d e
(integer) 5
127.0.0.1:6379[2]> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "e"
5) "d"

查询

lrange:获取指定范围的元素列表

索引从0开始,最后一个元素的索引为-1

lrange key start end

获取全部元素:

lrange key 0 -1

lindex:获取指定索引下标的元素

lindex key index

获取最后一个元素:

lindex key -1

llen:获取列表长度

llen key

删除

lpop:从左侧弹出元素(删除并返回)

lpop key 
127.0.0.1:6379[2]> lrange list 0 -1
1) "a"
2) "b"
3) "c"
4) "e"
5) "d"
127.0.0.1:6379[2]> lpop list
"a"
127.0.0.1:6379[2]> lrange list 0 -1
1) "b"
2) "c"
3) "e"
4) "d"

rpop:从右侧弹出元素(删除并返回)

rpop key

lrem:删除指定元素

lrem key count value

lrem会从列表中找到value元素进行删除,根据count分为三种情况:

  • count > 0从左到右,删除最多 count 个元素。
  • count < 0从右到左,删除最多 count 绝对值 个元素。
  • count = 0删除所有

除了lpop和rpop两个弹出命令外,还有两个弹出命令,叫做阻塞弹出,分别是blpopbrpop

blpop:规定时间内获取并移除数据,timeout:单位为秒

blpop key timeout

如果列表不为空,就立刻返回列表和弹出的元素

127.0.0.1:6379[2]> blpop list 10
"list"
"a"

如果列表为空,就阻塞timeout长时间,如果指定时间内其他客户端没有添加元素就返回nil,如果指定时间内其他客户端添加了元素 ,就返回列表和弹出的元素

127.0.0.1:6379[2]> blpop list 10
(nil)
(10.05s)

修改

lset:修改指定索引下标的元素

lset key index newValue

修改列表索引为0的元素为b:

127.0.0.1:6379[2]> lrange list 0 -1
1) "c"
2) "f"
3) "e"
127.0.0.1:6379[2]> lset list 0 b
OK
127.0.0.1:6379[2]> lrange list 0 -1
1) "b"
2) "f"
3) "e"

内部编码

列表类型内部有2种编码

  • ziplist(压缩列表):当列表的元素个数 小于 list-max-ziplist-entries 配置(默认 512 个)并且每个元素的值都小于list-max-ziplist-value 配置时(默认 64 字节),Redis就会采用ziplist来减少内存的使用
  • linkedlist(链表列表):当 列表类型 无法满足 ziplist 的条件时, Redis 会使用 linkedlist 作为 列表内部实现

可以使用object encoding key查看当前编码

当元素小于521个,且元素值小于64字节

127.0.0.1:6379> rpush listkey e1 e2 e3
(integer) 3
127.0.0.1:6379> object encoding listkey
"ziplist"

当元素大于521个

27.0.0.1:6379> rpush listkey e4 e5 ... e512 e513
(integer) 513
127.0.0.1:6379> object encoding listkey
"linkedlist"

Redis3.2 版本提供了 quicklist 内部编码,简单地说它是以一个 ziplist节点linkedlist,它结合了 ziplistlinkedlist 两者的优势,为 列表类型 提供了一种更为优秀的 内部编码 实现

常用场景

消息队列

通过lpushbrpop可以实现消息队列,生产方通过lpush添加元素,多个消费方通过brpop获取元素

通过lpushlpop可以实现栈

分页功能

通过lrange可以实现列表的分页功能

以上是关于Redis数据结构之列表的主要内容,如果未能解决你的问题,请参考以下文章

Redis数据操作之列表 | Redis

Redis数据结构之压缩列表

Redis数据结构之压缩列表

Redis===》数据类型之列表有序无序,常用命令,RDBAOFRDB+AOF

Redis数据结构之压缩列表-ziplist

Redis 基础数据结构之二 list(列表)