目录
1、介绍
Redis的list是一种有序、可重复且支持双向操作的数据结构,常用于实现消息队列等场景,支持在头部和尾部高效插入/删除元素,同时具备灵活的操作能力。
2、底层实现
list的存储结构根据元素数量和大小动态优化,不同版本之间的底层实现有区别。
【1】ziplist(压缩列表)
适用场景:
元素数量 < list-max-ziplist-entries(默认512个)且元素大小 < list-max-ziplist-value(默认64字节)
特点:
内存连续紧凑,减少内存碎片,但修改效率较低
【2】linkedlist(双向链表)
使用场景:
元素数量或大小超过ziplist阈值
特点:
支持头尾快速操作,但内存占用较高
【3】quicklist(Redis 3.3+默认)
结构:
由多个ziplist节点组成的双向链表(平衡内存和性能)
配置参数:
list-max-ziplist-size控制每个ziplist节点大小
3、常用指令
【1】基础操作
命令 | 作用 |
---|---|
LPUSH key value | 头部插入元素 |
RPUSH key value | 尾部插入元素 |
LPOP key | 头部移除并返回元素 |
RPOP key | 尾部移除并返回元素 |
LLEN key | 获取列表长度 |
LRANGE key start end | 获取索引范围内的元素,0到-1代表全部元素 |
【2】高级操作
命令 | 作用 |
---|---|
BLPOP key timeout | 阻塞式头部弹出元素(若列表为空,等待timeout秒),如果timeout=0就一直阻塞 |
LTRIM key start end | 修剪列表,仅保留指定范围内的元素 |
BRPOPLPUSH source dest timeout | 原子化的从源列表尾部弹出元素,并推入目标列表头部 |
4、使用场景
根据list类型的特性对应的使用场景如下:
特性 | 说明 | 场景 |
---|---|---|
双向操作 | 支持头部(LPUSH/LPOP)和尾部(RPUSH/RPOP)高效插入/删除元素 | 消息队列:生产者从头部推入任务,消费者从尾部取出任务 |
阻塞操作 | BLPOP/BRPOP支持阻塞式等待元素,避免轮询 | 实时任务调度:消费者阻塞等待新任务,减少空转 |
元素可重复 | 允许存储重复值 | 操作日志:记录重复事件(如用户多次点击) |
有序性 | 元素插入顺序排列 | 最新消息排行:保留最近的N条记录(如用户的搜索历史) |
范围查询 | LRANGE支持按索引范围获取元素 | 分页查询:获取列表的分页数据(如文章评论列表) |
快速长度获取 | LLEN可在O(1)时间复杂度获取列表长度 | 实时统计:快速统计待处理任务数量 |