摘要

List 核心详解

  • Redis List 是一个有序字符串列表,本质上是:
key -> List<String>
# 说明
元素按插入顺序排列
允许重复元素
支持从 左(头) 和 右(尾) 两端操作
  • List 的核心特性
有序
可重复
双端操作(Deque)
支持阻塞读
元素类型为 String(二进制安全)
  • Redis List 的理论最大长度为 2^32 - 1 = 4294967295,但实际业务中,元素数量 ≥ 10,000 就算 BigKey 了。
  • List的底层是一个双向链表,对双端的操作性能很高,但是通过索引下标直接操作某一个中间节点时性能很差
  • 常用数据结构
Stack(栈) = LPUSH + LPOP
Queue(队列)= LPUSH + RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP
  • List 的使用场景
视频列表、签到列表
排队机
简化版的MQ
  • 生产环境建议
List 只用于 顺序消费
始终限制 List 长度(LTRIM)
避免中间插入、删除
大 List 删除使用 UNLINK
高可靠消息不要用 List

List 命令

  • SpringBoot 的 RedisTemplate<K,V>.opsForList() 中 List 数据类型 的操作方法与 Redis 原生命令的对应关系如下:

区间访问与整体控制

方法功能方法Redis 原始命令备注
获取指定区间元素range(K key, long start, long end)LRANGE key start endend = -1 表示到末尾
裁剪 list,仅保留指定区间trim(K key, long start, long end)LTRIM key start end原地修改
获取 list 长度size(K key)LLEN key—
  • 📌 使用建议
    • LRANGE 0 -1 等价全量读取,小 list 可用
    • 大 list 建议分页 + LRANGE

左侧入队(Head)

方法功能方法Redis 原始命令备注
左侧插入一个元素leftPush(K key, V value)LPUSH key value返回插入后长度
左侧批量插入leftPushAll(K key, V... values)LPUSH key value [value ...]依次从左插入
左侧批量插入leftPushAll(K key, Collection<V> values)LPUSH key value [value ...]—
key 存在时左侧插入leftPushIfPresent(K key, V value)LPUSHX key valuekey 不存在不执行
在 pivot 左侧插入leftPush(K key, V pivot, V value)LINSERT key BEFORE pivot valuepivot 不存在返回 -1

右侧入队(Tail)

方法功能方法Redis 原始命令备注
右侧插入一个元素rightPush(K key, V value)RPUSH key value—
右侧批量插入rightPushAll(K key, V... values)RPUSH key value [value ...]—
右侧批量插入rightPushAll(K key, Collection<V> values)RPUSH key value [value ...]—
key 存在时右侧插入rightPushIfPresent(K key, V value)RPUSHX key value—
在 pivot 右侧插入rightPush(K key, V pivot, V value)LINSERT key AFTER pivot valuepivot 不存在返回 -1

非阻塞弹出

方法功能方法Redis 原始命令备注
左侧弹出leftPop(K key)LPOP key—
左侧批量弹出leftPop(K key, long count)LPOP key countRedis ≥ 6.2
右侧弹出rightPop(K key)RPOP key—
右侧批量弹出rightPop(K key, long count)RPOP key countRedis ≥ 6.2

阻塞弹出(Blocking Queue)

方法功能方法Redis 原始命令备注
左侧阻塞弹出leftPop(K key, timeout)BLPOP key timeout队列为空时阻塞
右侧阻塞弹出rightPop(K key, timeout)BRPOP key timeout—
  • 📌 典型场景:
    • 消息队列 / 任务队列
    • 简单生产者-消费者模型

原子移动

Redis 6.2+ 新模型(统一、可读性更强)

方法功能方法Redis 原始命令备注
原子移动(非阻塞)move(sourceKey, from, destinationKey, to)LMOVE source dest LEFT|RIGHT LEFT|RIGHTRedis ≥ 6.2
原子移动(阻塞)move(sourceKey, from, destinationKey, to, timeout)BLMOVE source dest LEFT|RIGHT LEFT|RIGHT timeoutRedis ≥ 6.2
  • 语义说明
    • 从 sourceKey 的一端 POP
    • 向 destinationKey 的一端 PUSH
    • 整个过程 原子性保证
  • 命令参数说明:
    • source:源 List(从这里取一个元素)
    • dest:目标 List(往这里放一个元素)
    • 第一个 LEFT/RIGHT:从 source 的哪一端弹出元素
    • 第二个 LEFT/RIGHT:从 dest 的哪一端插入元素
    • timeout: 阻塞时间
      • 当 source 为空(或不存在)时,客户端最多阻塞等待 timeout 秒,直到有元素可被移动,或等待超时。
      • timeout = 0:无限期阻塞,直到有数据可用或连接断开

旧命令(即将废弃)

方法功能方法Redis 原始命令推荐替代
右弹左插rightPopAndLeftPush(...)RPOPLPUSHLMOVE
阻塞右弹左插rightPopAndLeftPush(..., timeout)BRPOPLPUSHBLMOVE

随机访问与定位(O(N))

方法功能方法Redis 原始命令备注
获取第一个元素getFirst(K key)LINDEX key 0O(N)
获取最后一个元素getLast(K key)LINDEX key -1O(N)
获取指定索引元素index(K key, long index)LINDEX key indexO(N)

⚠️ 注意: List 不是数组,随机访问是线性扫描,不适合频繁随机读取

搜索与删除

方法功能方法Redis 原始命令备注
删除指定值remove(K key, long count, Object value)LREM key count valuecount ≥0 从左,<0 从右
获取首次出现位置indexOf(K key, V value)LPOS key valueRedis ≥ 6.0
获取最后出现位置lastIndexOf(K key, V value)LPOS key value RANK -1Redis ≥ 6.0

List 的典型使用模式总结

场景推荐方式
队列(FIFO)RPUSH + LPOP
栈(LIFO)LPUSH + LPOP
阻塞队列BLPOP / BRPOP
可靠队列LMOVE / BLMOVE
消息转移LMOVE source dest
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐