image.png

  • 列表最多可以存储 2 - 1 个元素

image.png

特点:

  • 列表中的元素是有序的, 可以通过索引下标获取某个元素或者某个范围内的元素列表 (不确定这里的有序是指?)
  • 元素可以重复

image.png

2.4.1 命令

image.png

1. 添加操作

(1) 从右边插入元素
  • rpush
  • 从左到右获取列表的所有元素: lrange

(2) 从左边插入元素
  • lpush

(3) 向某个元素前或者后插入元素
  • linsert

2. 查找

(1) 获取指定范围内的元素列表
  • lrange
    • 从左到右: 0~N-1
    • 从右到左: -1~-N
    • end 选项包含自身

(2) 获取列表指定索引下标的元素
  • lindex

(3) 获取列表长度
  • llen

3. 删除

(1) 从列表左侧弹出元素
  • lpop

(2) 从列表右侧弹出
  • rpop

(3) 删除指定元素
  • lrem
    • count 参数
      • 0: 从左到右, 最多删除 count 个元素

      • <0: 从右到左
      • =0: 删除所有

(4) 按照索引范围修剪列表
  • ltrim

4. 修改

  • lset

5. 阻塞操作

阻塞式弹出:

  • blpop
  • brpop
    • key
    • timeout

注意:

  • 如果是多个键, 那么 brpop 会从左至右遍历键, 一旦有一个键能弹出元素, 客户端立即返回

image.png

2.4.2 内部编码

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

  • ziplist

当列表的元素个数小于 list-max-ziplist-entries 配置 (默认512个), 同时列表中每个元素的值都小于 list-max-ziplistvalue 配置时 (默认64字节), Redis 会选用 ziplist 来作为列表的内部实现来减少内存的使用。

  • linkedlist

当列表类型无法满足 ziplist 的条件时, Redis 会使用 linkedlist 作为列表的内部实现

Redis3.2 版本提供了quicklist 内部编码, 简单地说它是以一个 ziplist 为节点的 linkedlist, 它结合了 ziplist 和 linkedlist 两者的优势, 为列表类型提供了一种更为优秀的内部编码实现, 它的设计原理可以参考 Redis 的另一个作者 Matt Stancliff 的博客: https://matt.sh/redis-quicklist

2.4.3 使用场景

1. 消息队列

阻塞队列:

  • lpush + brpop

image.png

2. 文章列表

3. 其它

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