分享免费的编程资源和教程

网站首页 > 技术教程 正文

Redis List 命令操作(redis列表常用命令)

goqiw 2025-06-30 16:10:30 技术教程 4 ℃ 0 评论

一、常用命令详解

1. 元素操作

命令

描述

示例

时间复杂度

LPUSH key value

从头部插入一个或多个值

LPUSH mylist a b c → [c,b,a]

O(1)

RPUSH key value

从尾部插入一个或多个值

RPUSH mylist x y z → [c,b,a,x,y,z]

O(1)

`LINSERT key BEFORE

AFTER pivot value`

在指定元素前后插入新值

LINSERT mylist AFTER b new → [c,b,new,a,x,y,z]

2. 查询与截取

命令

描述

示例

时间复杂度

LRANGE key start stop

获取指定索引范围的元素(支持负数索引)

LRANGE mylist 0 -1 → 全量输出

O(N)

LINDEX key index

获取指定索引的元素

LINDEX mylist 2 → a

O(N)

LLEN key

返回列表长度

LLEN mylist → 7

O(1)

3. 删除与修改

命令

描述

示例

时间复杂度

LPOP/RPOP key

从头部/尾部弹出并返回元素

LPOP mylist → c

O(1)

LTRIM key start stop

截断列表,仅保留指定区间元素

LTRIM mylist 1 3 → [b,a,x]

O(N)

LSET key index value

设置指定索引的元素值

LSET mylist 2 new_val

O(N)

4. 阻塞式操作

命令

描述

示例

BLPOP key timeout

阻塞式左端弹出,超时后返回空

BLPOP mylist 5 → 等待5秒

BRPOP key timeout

阻塞式右端弹出

BRPOP mylist 5


二、高级应用场景

1. 消息队列(生产者-消费者模型)

bash

复制


# 生产者:LPUSH 入队
LPUSH task_queue "task1"
LPUSH task_queue "task2"

# 消费者:BRPOP 出队(阻塞等待)
BRPOP task_queue 0  # 0 表示无限等待


特点

支持多消费者并行处理

通过 BLPOP 避免轮询空队列5

6

2. 分页查询

bash

复制


# 获取第2页数据(每页3条)
LRANGE mylist 3 5


优化建议

使用 LTRIM 限制列表长度,防止内存膨胀

结合 SCAN 实现海量数据分页4

3. 最近访问记录

bash

复制


# 用户访问时 LPUSH 记录
LPUSH user:1001:history "2025-06-21 10:00:00"
# 保留最近10条记录
LTRIM user:1001:history 0 9



三、性能优化与注意事项

1. 内存优化

压缩列表(ziplist) :当列表元素较少且长度较短时,Redis 会使用压缩列表节省内存。

QuickList :Redis 5.0+ 默认使用 QuickList(双向链表 + ziplist),平衡内存与性能6

。2. 原子操作

事务(MULTI/EXEC) :确保多个命令的原子性:bash

复制


MULTI
LPUSH list1 "a"
RPUSH list2 "b"
EXEC


Lua 脚本 :复杂逻辑的原子执行:lua

复制


-- 将元素从 list1 移动到 list2
redis.call('RPOP', KEYS[1])
redis.call('LPUSH', KEYS[2], ARGV[1])


3. 阻塞操作注意事项

超时时间 :合理设置 timeout,避免长时间阻塞。

多键阻塞 :BLPOP key1 key2 timeout 会按顺序检查键是否存在元素5

四、与 Sorted Set 的对比

特性

List

Sorted Set

排序方式

插入顺序

分数(Score)排序

元素唯一性

允许重复

唯一

范围查询效率

O(N)

O(log N)

适用场景

消息队列、分页

排行榜、优先级队列


五、实战示例:秒杀库存控制

bash

复制


# 初始化库存
LPUSH stock:1001 100

# 下单时原子性操作(使用 Lua 脚本)
EVAL "
local stock = tonumber(redis.call('LPOP', KEYS[1]))
if stock > 0 then
    redis.call('RPUSH', KEYS[1], stock - 1)
    return stock
else
    redis.call('LPUSH', KEYS[1], stock)
    return 0
end
" 1 stock:1001



在呼叫系统中的应用

Redis List 顶顶通呼叫系统中可以进行应用取出通话信息

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表