一、特征

  • 最多存储2E32 - 1 个元素
  • 可以对两端进行插入(push)和弹出(pop)
  • 列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表
  • 列表中的元素可以是重复的

二、命令

操作类型 操作
添加 rpush lpush linsert
lrange lindex llen
删除 lpop rpop lrem ltrim
修改 lset
阻塞操作 blpop brpop

1. 添加操作

  • 从右边插入元素
rpush key value [value...]
从左到右获取列表的所有元素
lrange key 0 -1
  • 从左侧插入元素
lpush key value [value...]
  • 向某个元素前或者后插入元素
linsert key before|after pivot value
linsert命令会从列表中找到等于pivot的元素,在其前或者后插入一个新的元素value

2. 查找

  • 获取指定范围内的元素列表
lrange key start end
1. 索引下标从左到右分别是0 - N-1 ,但是从右到左分别是-1 到 -N
2. lrange中的end选项包含了自身
  • 获取列表指定索引下标的元素
lindex key index
获取最后一个元素:
lindex key -1
  • 获取列表长度
llen key

3. 删除

  • 从列表左侧弹出元素
lpop key 
  • 从列表右侧弹出元素
rpop key 
  • 删除指定元素
lrem key count value
该命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:
1. count>0 从左到右,删除最多count个元素
2. count<0 从右到左,删除最多count绝对值个元素
3. count=0 删除所有
  • 按照索引范围修剪列表
ltrim key start end

4. 修改

lset key index newValue

5. 阻塞操作

blpop key [key...] timeout
brpop key [key...] timeout
  • blpop和brpop是lpop、rpop的阻塞版本
  • 列表为空:如果timeout=3,那么会等待三秒后返回,如果timeout=0,那么会一直阻塞下去,如果期间有了数据,会立即返回
  • 列表不为空:客户端会立即返回
  1. 如果是多个键,那么brpop会从左到右遍历键,一旦有一个键能弹出元素,客户端立即返回
  2. 如果多个客户端同时对一个键执行brpop,那么最先执行brpop命令的客户端可以获取到弹出的值

三、内部编码

1. ziplist

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

2. linkedlist

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

四、使用场景

1. 消息队列

  • Redis的lpush和brpop命令组合即可实现阻塞队列,生产者客户端使用lpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性

2. 文章列表

五、使用技巧

1. lpush + lpop = Stack(栈)

2. lpush + rpop = Queue(队列)

3. lpush + ltrim = Capped Collection(有限集合)

4. lpush + brpop = Message Queue(消息队列)