区间读取是什么
列表是按插入顺序排列的字符串序列,区间读取命令按下标取出一段元素:零表示最左端,负一表示最右端,因此取全量就是从零到负一。下标越界不会报错,会自动截断到有效范围。列表适合时间线、队列这类两端操作的场景,但要注意它两端的插入会让已有元素的下标跟着变化,用固定下标做分页会漂移。
基本信息
| 用途 | 按下标区间读取列表元素 |
|---|---|
| 语法 | 区间读取 键 起始 结束 |
| 下标规则 | 零起算,负数从右端计数 |
| 越界行为 | 自动截断到有效范围,起始大于结束返回空 |
| 复杂度 | 与偏移量和返回元素数相关 |
| 注意事项 | 元素增删会让下标漂移 |
典型使用场景
- 展示最新动态:从列表右端取最近若干条
- 队列消费者一次读取一批任务
- 最近浏览记录、搜索历史这类定长列表
- 任务列表分段处理:按区间取一段再处理
- 调试排障:查看列表中已写入的元素
- 与截断命令配合:列表只保留固定长度,读取时按区间取
示例
示例
RPUSH timeline:u1 t1 t2 t3 t4 t5 # 依次写入五个元素
LRANGE timeline:u1 0 2 # 取前三个:t1 t2 t3
LRANGE timeline:u1 -2 -1 # 取最后两个:t4 t5
LRANGE timeline:u1 0 -1 # 取全量,元素多时慎用
LRANGE timeline:u1 5 3 # 起始大于结束,返回空数组
LTRIM timeline:u1 0 99 # 只保留前一百条,控制列表长度读取行为读法
| 情况 | 返回 | 处理 |
|---|---|---|
| 正常区间 | 范围内的元素 | 按顺序返回 |
| 负下标 | 从右端计数的元素 | 常用于取最近记录 |
| 起始大于结束 | 空数组 | 不是错误,按空数据处理 |
| 下标越界 | 截断到有效范围 | 结果可能少于预期但不会报错 |
| 键不存在 | 空数组 | 与空列表表现一致 |
| 键类型不对 | 类型错误 | 先确认键的类型 |
| 读取大列表全量 | 一次性返回全部元素 | 有阻塞风险,应改为区间读取 |
用偏移量做分页时,列表两端不断插入会让下标漂移,翻页出现重复或遗漏;对顺序稳定性要求高的场景应考虑带唯一标识的有序结构。
取全量在大列表上会一次返回全部元素,既占带宽也阻塞实例处理其他请求,应改用区间读取,或先截断列表长度再读。
列表只适合两端操作:在中间位置插入或删除元素的代价随列表长度上升,业务若频繁按位置改动中间元素,应改用其他数据结构。
列表使用清单
- 写入后用截断命令控制列表长度,避免无限增长
- 读取按区间而非全量,控制单次返回规模
- 队列消费使用阻塞式弹出命令,避免空轮询
- 明确写入端:统一从左或右插入,避免顺序混乱
- 分页场景评估下标漂移的影响,必要时记录水位线
- 列表长度纳入监控,异常增长说明清理逻辑缺失
列表长度接近上限时,读取与截断的耗时都会上升:把列表当作缓存队列使用时,务必同时配置长度上限与过期时间,两道保险缺一不可。