链条传动

砥砺前行,不忘初心!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

列表(list) 类型是用来存储多个有序的字符串

列表中的每个字符串称为元素(element) , 一个列表最多可以存储232-1个元素。

列表是一种比较灵活的数据结构, 它可以充当栈和队列的角色, 在实际开发上有很多应用场景

 

列表类型有两个特点:

第一、 列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。
第二、 列表中的元素可以是重复的

 

命令

添加
从由插入
rpush key value [value ...]
从左插入
lpush key value [value ...]
向某个元素前或后插入
linsert key before|after pivot value



查找
获取指定范围内的元素列表
lrange key start end
lrange操作会获取列表指定索引范围所有的元素。 索引下标有两个特点: 
第一, 索引下标从左到右分别是0到N-1, 但是从右到左分别是-1到-N。
第二, lrange中的end选项包含了自身

获取列表指定索引下标的元素
lindex key index
获取列表长度
llen key


删除
从列表左侧弹出元素
lpop key
从列表右侧弹出
rpop key
删除指定元素
lrem key count value
lrem命令会从列表中找到等于value的元素进行删除, 根据count的不同
分为三种情况:
  ·count>0, 从左到右, 删除最多count个元素。
  ·count<0, 从右到左, 删除最多count绝对值个元素。
  ·count=0, 删除所有。

按照索引范围修剪列表(只保留指定范围内从列表数据)
ltrim key start end


修改
修改指定索引下标的元素
lset key index newValue


阻塞操作
阻塞式弹出
blpop key [key ...] timeout
brpop key [key ...] timeout
blpop和brpop是lpop和rpop的阻塞版本, 它们除了弹出方向不同, 使用方法基本相同, 所以下面以brpop命令进行说明, brpop命令包含两个参数:
  ·key [key...]: 多个列表的键。
  ·timeout: 阻塞时间(单位: 秒)。
注:
列表为空: 如果timeout=3, 那么客户端要等到3秒后返回, 如果timeout=0, 那么客户端一直阻塞等下去(如果此时向列表中插入数据,列表就有数据了,就会立刻返回)
列表不为空: 如果timeout=0,客户端会立即返回

 

 

列表相关命令时间复杂度

 

内部编码

列表类型的内部编码有两种。

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

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

 

 

使用场景

消息队列

文章列表

 

 

实际上列表的使用场景很多, 在选择时可以参考以下口诀:

·lpush+lpop=Stack( 栈)
·lpush+rpop=Queue( 队列)
·lpsh+ltrim=Capped Collection( 有限集合)
·lpush+brpop=Message Queue( 消息队列)

 

posted on 2020-11-11 18:19  链条君  阅读(97)  评论(0编辑  收藏  举报