Redis 命令及数据类型 -- List
摘要
- 本文介绍 Redis List 数据类型
- 本文基于
redis-7.4.7 - Redis官网:https://redis.io/
- Redis 命令文档:https://redis.io/docs/latest/commands/
List 数据类型
-
Redis List 是一个有序字符串列表,本质上是:
1 | key -> List<String> |
-
List 的核心特性
1 | 有序 |
-
Redis List 的理论最大长度为 2^32 - 1 = 4294967295,但实际业务中,元素数量 ≥ 10,000 就算 BigKey 了。
-
生产环境建议
1 | 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 |