列表长度的常数时间读取
LLEN 返回列表的元素个数,复杂度为 O(1),键不存在时返回 0。它看起来简单,但在监控与限长场景里非常实用:采样列表长度就能判断队列积压,不需要把内容全部拉回来数。要注意列表被消费空之后键会自动消失,因此不能用「键是否存在」判断列表是否非空。
基本信息
| 适用平台 | Redis 全版本 |
|---|---|
| 语法 | LLEN key |
| 返回值 | 元素个数;键不存在返回 0 |
| 复杂度 | O(1) |
| 副作用 | 无;空列表键会被自动删除 |
典型使用场景
- 队列积压监控:定期采样长度,超过阈值告警
- 限长判断:写入前检查长度,超过上限则拒绝或裁剪
- 容量评估:观察列表增长趋势,为扩容提供依据
- 清理前确认:判断某个列表是否已经空置可以删除
- 压测验证:确认生产与消费速率是否匹配
- 发布前核对:确认待处理任务已清空,避免重启后重复消费
示例与监控写法
示例与监控写法
RPUSH queue:email a b c d
LLEN queue:email # 4
LPOP queue:email
LLEN queue:email # 3
# 空列表的键会自动删除,此时 LLEN 仍返回 0
LPOP queue:email
LLEN queue:email # 0
EXISTS queue:email # 0:键已不存在
# 积压监控:定期采样并告警
# watch -n 30 'redis-cli LLEN queue:email'相关命令对照
| 命令 | 作用 | 复杂度 |
|---|---|---|
| LLEN | 返回列表长度 | O(1),适合高频采样 |
| LRANGE 0 -1 | 取回全部元素 | O(N),会拉取全部数据 |
| LPOS | 查找元素位置 | O(N) |
| LPUSH / RPUSH | 向两端写入 | O(1) |
| LPOP / RPOP | 从两端弹出 | O(1) |
监控列表积压用 LLEN 采样即可:LRANGE 0 -1 会把全部元素拉回客户端,在长列表上是典型的自伤操作。
不要用 EXISTS 判断列表是否有数据:空列表的键已经被删除,判断非空应看 LLEN 是否大于 0。
积压监控要同时看生产与消费两侧:只盯长度会在消费线程卡死时后知后觉。常见做法是给长度设两级阈值,超过一级提醒值班,超过二级触发自动扩容或限流生产端,同时采集消费速率作为辅助判断。
列表长度与内存不是线性关系:元素本身较大或采用紧凑编码时,单条记录的内存占用差别很大。评估容量应结合 MEMORY USAGE 抽样测量,而不是只看长度乘以一个拍脑袋的系数。