Redis 命令及数据类型 -- List

摘要

List 数据类型

  • Redis List 是一个有序字符串列表,本质上是:

1
2
3
4
5
key -> List<String>
# 说明
元素按插入顺序排列
允许重复元素
支持从 左(头) 和 右(尾) 两端操作
  • List 的核心特性

1
2
3
4
5
有序
可重复
双端操作(Deque)
支持阻塞读
元素类型为 String(二进制安全)
  • Redis List 的理论最大长度为 2^32 - 1 = 4294967295,但实际业务中,元素数量 ≥ 10,000 就算 BigKey 了。

  • 生产环境建议

1
2
3
4
5
List 只用于 顺序消费
始终限制 List 长度(LTRIM)
避免中间插入、删除
大 List 删除使用 UNLINK
高可靠消息不要用 List
  • SpringBoot 的 RedisTemplate<K,V> 中 List 数据类型 的操作方法与 Redis 原生命令的对应关系如下:

方法功能 方法 redisTemplate.opsForList().xxx() Redis 原始命令 命令备注 / 推荐替代
获取指定区间元素 List<V> range(K key, long start, long end) LRANGE key start end end = -1 表示到末尾
裁剪 list,仅保留指定区间 void trim(K key, long start, long end) LTRIM key start end 原地修改
获取 list 长度 Long size(K key) LLEN key
左侧插入一个元素 Long leftPush(K key, V value) LPUSH key value 返回插入后长度
左侧批量插入 Long leftPushAll(K key, V... values) LPUSH key value [value ...] 依次从左插入
左侧批量插入 Long leftPushAll(K key, Collection<V> values) LPUSH key value [value ...]
key 存在时左侧插入 Long leftPushIfPresent(K key, V value) LPUSHX key value key 不存在不执行
在 pivot 左侧插入 Long leftPush(K key, V pivot, V value) LINSERT key BEFORE pivot value pivot:List 中某一个已存在的元素值
pivot 不存在返回 -1
右侧插入一个元素 Long rightPush(K key, V value) RPUSH key value
右侧批量插入 Long rightPushAll(K key, V... values) RPUSH key value [value ...]
右侧批量插入 Long rightPushAll(K key, Collection<V> values) RPUSH key value [value ...]
key 存在时右侧插入 Long rightPushIfPresent(K key, V value) RPUSHX key value
在 pivot 右侧插入 Long rightPush(K key, V pivot, V value) LINSERT key AFTER pivot value pivot 不存在返回 -1
原子移动元素(非阻塞) V move(sourceKey, from, destinationKey, to) LMOVE sourceKey destKey LEFT|RIGHT LEFT|RIGHT Redis ≥ 6.2
LMOVE 本质等价于以下两个操作的原子组合:
1. 从 source 的一端 POP 一个元素
2. 将该元素 PUSH 到 destination 的一端
参数说明:
sourceKey:源 List(从这里取一个元素)
destinationKey:目标 List(往这里放一个元素)
第一个 LEFT/RIGHT:从 sourceKey 的哪一端弹出元素
第二个 LEFT/RIGHT:从 destinationKey 的哪一端插入元素
原子移动元素(阻塞) V move(sourceKey, from, destinationKey, to, timeout) BLMOVE sourceKey destKey LEFT|RIGHT LEFT|RIGHT timeout Redis ≥ 6.2
timeout: 当 sourceKey 为空(或不存在)时,客户端最多阻塞等待 timeout 秒,直到有元素可被移动,或等待超时。
timeout = 0:无限期阻塞,直到有数据可用或连接断开
设置指定索引的值 void set(K key, long index, V value) LSET key index value index 越界报错
删除指定值 Long remove(K key, long count, Object value) LREM key count value count >0 从左,<0 从右
获取第一个元素 V getFirst(K key) LINDEX key 0 O(N)
获取最后一个元素 V getLast(K key) LINDEX key -1 O(N)
获取指定索引元素 V index(K key, long index) LINDEX key index O(N)
获取首次出现位置 Long indexOf(K key, V value) LPOS key value Redis ≥ 6.0
获取最后出现位置 Long lastIndexOf(K key, V value) LPOS key value RANK -1 Redis ≥ 6.0
左侧弹出 V leftPop(K key) LPOP key
左侧批量弹出 List<V> leftPop(K key, long count) LPOP key count Redis ≥ 6.2
左侧阻塞弹出 V leftPop(K key, timeout) BLPOP key timeout 阻塞操作
右侧弹出 V rightPop(K key) RPOP key
右侧批量弹出 List<V> rightPop(K key, long count) RPOP key count Redis ≥ 6.2
右侧阻塞弹出 V rightPop(K key, timeout) BRPOP key timeout 阻塞操作
右侧弹出并左侧插入 V rightPopAndLeftPush(sourceKey, destinationKey) RPOPLPUSH source dest 已废弃 推荐 LMOVE sourceKey destKey LEFT|RIGHT LEFT|RIGHT
阻塞式右弹左插 V rightPopAndLeftPush(sourceKey, destinationKey, timeout) BRPOPLPUSH source dest timeout已废弃 推荐 BLMOVE sourceKey destKey LEFT|RIGHT LEFT|RIGHT timeout