本文档风哥主要介绍Redis List类型的队列系统实战,包括List类型概念、List操作命令、List使用场景、List队列规划、队列设计、性能考虑、基础操作、高级操作、阻塞操作、过期操作以及实战案例等内容,风哥教程参考Redis官方文档Data types guide等内容编写,适合DBA人员和开发人员在生产环境中使用。
Part01-基础概念与理论知识
1.1 List类型概念
Redis List是一个有序的字符串列表,它可以在列表的两端进行插入和删除操作。List类型的特点:
- 有序:元素按照插入顺序排序
- 可重复:允许存储重复的元素
- 双向:可以在两端进行操作
- 存储容量:最多可以存储2^32-1个元素
1.2 List操作命令
## 1. 基础命令
– LPUSH:从列表左侧插入元素
– RPUSH:从列表右侧插入元素
– LPOP:从列表左侧弹出元素
– RPOP:从列表右侧弹出元素
– LLEN:获取列表长度
– LRANGE:获取列表指定范围的元素
– LINDEX:获取列表指定索引的元素
– LSET:设置列表指定索引的元素
– LREM:删除列表中指定的元素
## 2. 高级命令
– LPUSHX:只有当列表存在时才从左侧插入元素
– RPUSHX:只有当列表存在时才从右侧插入元素
– LINSERT:在列表指定元素前或后插入元素
– LTRIM:修剪列表,保留指定范围的元素
– BLPOP:阻塞式从列表左侧弹出元素
– BRPOP:阻塞式从列表右侧弹出元素
– BRPOPLPUSH:阻塞式从一个列表弹出元素并推入另一个列表
## 3. 过期命令
– EXPIRE:设置列表的过期时间
– TTL:查看列表的剩余过期时间
– PERSIST:移除列表的过期时间
1.3 List使用场景
List类型的使用场景:
- 消息队列:实现生产者-消费者模式
- 任务队列:存储待执行的任务
- 流式数据处理:处理实时数据流
- 最近事件记录:存储最近发生的事件
- 排行榜:存储排名数据
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 List队列规划
生产环境List队列规划:
- 队列命名规范:使用业务前缀+队列类型的方式,如queue:message
- 队列大小:根据业务需求设计合理的队列大小
- 消费速度:确保消费速度大于生产速度
- 重试机制:设计合理的重试策略
2.2 队列设计
- 消息格式:使用JSON格式存储消息,便于解析
- 消息大小:控制消息大小,避免过大
- 消息过期:设置合理的消息过期时间
- 队列监控:监控队列长度和消费速度
- 错误处理:设计合理的错误处理机制
2.3 性能考虑
## 1. 操作性能
– LPUSH/RPUSH:O(1)
– LPOP/RPOP:O(1)
– LLEN:O(1)
– LRANGE:O(N),N为元素数量
– LREM:O(N),N为元素数量
## 2. 性能优化
– 避免使用LRANGE获取大列表
– 使用阻塞操作(BLPOP/BRPOP)减少轮询
– 合理控制队列大小,避免队列过长
– 使用管道(Pipeline)批量执行操作
## 3. 最佳实践
– 对于大列表,考虑使用多个List分片
– 对于高频操作,使用管道减少网络开销
– 监控队列长度,及时处理队列积压
学习交流加群风哥QQ113257174
Part03-生产环境项目实施方案
3.1 基础操作
## 1. 从列表左侧插入元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush queue:message “{\”id\”:1,\”content\”:\”Hello Redis\”}” “{\”id\”:2,\”content\”:\”Hello List\”}”
# 输出示例
(integer) 2
## 2. 从列表右侧插入元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush queue:message “{\”id\”:3,\”content\”:\”Hello Queue\”}”
# 输出示例
(integer) 3
## 3. 从列表左侧弹出元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpop queue:message
# 输出示例
“{\”id\”:2,\”content\”:\”Hello List\”}”
## 4. 从列表右侧弹出元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpop queue:message
# 输出示例
“{\”id\”:3,\”content\”:\”Hello Queue\”}”
## 5. 获取列表长度
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 llen queue:message
# 输出示例
(integer) 1
## 6. 获取列表指定范围的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrange queue:message 0 -1
# 输出示例
1) “{\”id\”:1,\”content\”:\”Hello Redis\”}”
## 7. 获取列表指定索引的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lindex queue:message 0
# 输出示例
“{\”id\”:1,\”content\”:\”Hello Redis\”}”
## 8. 设置列表指定索引的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lset queue:message 0 “{\”id\”:1,\”content\”:\”Hello Redis Updated\”}”
# 输出示例
OK
## 9. 删除列表中指定的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrem queue:message 1 “{\”id\”:1,\”content\”:\”Hello Redis Updated\”}”
# 输出示例
(integer) 1
3.2 高级操作
## 1. 只有当列表存在时才从左侧插入元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpushx queue:message “{\”id\”:4,\”content\”:\”Hello LPUSHX\”}”
# 输出示例
(integer) 1
## 2. 只有当列表存在时才从右侧插入元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpushx queue:message “{\”id\”:5,\”content\”:\”Hello RPUSHX\”}”
# 输出示例
(integer) 2
## 3. 在列表指定元素前或后插入元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 linsert queue:message before “{\”id\”:5,\”content\”:\”Hello RPUSHX\”}” “{\”id\”:6,\”content\”:\”Hello Insert\”}”
# 输出示例
(integer) 3
## 4. 修剪列表,保留指定范围的元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ltrim queue:message 0 1
# 输出示例
OK
## 5. 查看修剪后的列表
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrange queue:message 0 -1
# 输出示例
1) “{\”id\”:4,\”content\”:\”Hello LPUSHX\”}”
2) “{\”id\”:6,\”content\”:\”Hello Insert\”}”
3.3 阻塞操作
## 1. 阻塞式从列表左侧弹出元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 blpop queue:message 10
# 输出示例(有元素)
1) “queue:message”
2) “{\”id\”:4,\”content\”:\”Hello LPUSHX\”}”
# 输出示例(无元素,超时)
(nil)
(10.00s)
## 2. 阻塞式从列表右侧弹出元素
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 brpop queue:message 10
# 输出示例
1) “queue:message”
2) “{\”id\”:6,\”content\”:\”Hello Insert\”}”
## 3. 阻塞式从一个列表弹出元素并推入另一个列表
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush queue:source “{\”id\”:1,\”content\”:\”Hello Source\”}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 brpoplpush queue:source queue:target 10
# 输出示例
“{\”id\”:1,\”content\”:\”Hello Source\”}”
## 4. 查看目标列表
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrange queue:target 0 -1
# 输出示例
1) “{\”id\”:1,\”content\”:\”Hello Source\”}”
3.4 过期操作
## 1. 设置列表的过期时间(秒)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush queue:temp “{\”id\”:1,\”content\”:\”Hello Temp\”}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire queue:temp 300
# 输出示例
(integer) 1
## 2. 查看列表的剩余过期时间(秒)
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ttl queue:temp
# 输出示例
(integer) 299
## 3. 移除列表的过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 persist queue:temp
# 输出示例
(integer) 1
风哥提示:Redis接口限流是保护系统的重要机制,合理的限流策略可以防止系统过载,确保系统的稳定性和可用性。在实际应用中,需要根据具体业务场景和数据特点,选择合适的限流算法和策略。
Part04-生产案例与实战讲解
4.1 消息队列
## 1. 生产者发送消息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush queue:messages “{\”id\”:1,\”type\”:\”email\”,\”to\”:\”fgedu01@fgedu.net.cn\”,\”content\”:\”Hello Email\”}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush queue:messages “{\”id\”:2,\”type\”:\”sms\”,\”to\”:\”13800138000\”,\”content\”:\”Hello SMS\”}”
# 输出示例
(integer) 2
## 2. 消费者消费消息
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 blpop queue:messages 0
# 输出示例
1) “queue:messages”
2) “{\”id\”:1,\”type\”:\”email\”,\”to\”:\”fgedu01@fgedu.net.cn\”,\”content\”:\”Hello Email\”}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 blpop queue:messages 0
# 输出示例
1) “queue:messages”
2) “{\”id\”:2,\”type\”:\”sms\”,\”to\”:\”13800138000\”,\”content\”:\”Hello SMS\”}”
## 3. 监控队列长度
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 llen queue:messages
# 输出示例
(integer) 0
4.2 任务队列
## 1. 生产者添加任务
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush queue:tasks “{\”id\”:1,\”type\”:\”backup\”,\”target\”:\”db1\”,\”priority\”:1}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush queue:tasks “{\”id\”:2,\”type\”:\”cleanup\”,\”target\”:\”logs\”,\”priority\”:2}”
# 输出示例
(integer) 2
## 2. 消费者执行任务
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 blpop queue:tasks 0
# 输出示例
1) “queue:tasks”
2) “{\”id\”:1,\”type\”:\”backup\”,\”target\”:\”db1\”,\”priority\”:1}”
## 3. 处理任务并标记完成
# 假设处理完成后,将任务移到完成队列
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush queue:tasks:done “{\”id\”:1,\”type\”:\”backup\”,\”target\”:\”db1\”,\”status\”:\”completed\”}”
# 输出示例
(integer) 1
## 4. 查看任务队列状态
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 llen queue:tasks
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 llen queue:tasks:done
# 输出示例
(integer) 1
(integer) 1
4.3 流式数据处理
## 1. 写入流数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush stream:sensor “{\”timestamp\”:1651234567,\”sensor_id\”:1,\”value\”:25.5}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush stream:sensor “{\”timestamp\”:1651234568,\”sensor_id\”:1,\”value\”:25.6}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 rpush stream:sensor “{\”timestamp\”:1651234569,\”sensor_id\”:1,\”value\”:25.7}”
# 输出示例
(integer) 3
## 2. 处理流数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrange stream:sensor 0 -1
# 输出示例
1) “{\”timestamp\”:1651234567,\”sensor_id\”:1,\”value\”:25.5}”
2) “{\”timestamp\”:1651234568,\”sensor_id\”:1,\”value\”:25.6}”
3) “{\”timestamp\”:1651234569,\”sensor_id\”:1,\”value\”:25.7}”
## 3. 修剪流数据,只保留最近的2条
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ltrim stream:sensor -2 -1
# 输出示例
OK
## 4. 查看修剪后的流数据
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrange stream:sensor 0 -1
# 输出示例
1) “{\”timestamp\”:1651234568,\”sensor_id\”:1,\”value\”:25.6}”
2) “{\”timestamp\”:1651234569,\”sensor_id\”:1,\”value\”:25.7}”
4.4 最近事件记录
## 1. 记录事件
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush events:recent “{\”timestamp\”:1651234567,\”type\”:\”login\”,\”user_id\”:1001}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush events:recent “{\”timestamp\”:1651234568,\”type\”:\”logout\”,\”user_id\”:1001}”
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lpush events:recent “{\”timestamp\”:1651234569,\”type\”:\”login\”,\”user_id\”:1002}”
# 输出示例
(integer) 3
## 2. 修剪事件列表,只保留最近的2条
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 ltrim events:recent 0 1
# 输出示例
OK
## 3. 查看最近事件
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 lrange events:recent 0 -1
# 输出示例
1) “{\”timestamp\”:1651234569,\”type\”:\”login\”,\”user_id\”:1002}”
2) “{\”timestamp\”:1651234568,\”type\”:\”logout\”,\”user_id\”:1001}”
## 4. 设置事件列表过期时间
$ /redis/app/bin/redis-cli -h 192.168.1.100 -p 6379 -a fgedu@2026 expire events:recent 3600
# 输出示例
(integer) 1
更多学习教程公众号风哥教程itpux_com
Part05-风哥经验总结与分享
5.1 最佳实践
Redis List队列系统最佳实践:
- 队列命名规范:使用业务前缀+队列类型的方式,如queue:message,学习交流加群风哥微信: itpux-com
- 使用阻塞操作:减少轮询,提高性能
- 合理控制队列大小:避免队列过长导致内存问题
- 设置过期时间:对于临时数据,设置合理的过期时间
- 监控队列状态:及时发现队列积压问题
- 错误处理:设计合理的错误处理和重试机制
5.2 常见问题
- 队列积压:增加消费者数量,优化消费速度
- 消息丢失:使用BRPOPLPUSH确保消息处理的可靠性
- 内存使用过高:控制队列大小,设置合理的过期时间
- 性能下降:使用管道批量操作,避免使用LRANGE获取大列表
- 消息顺序:Redis List保证消息的插入顺序
5.3 优化技巧
## 1. 队列设计优化
– 使用多个队列处理不同类型的消息
– 为重要消息设置优先级队列
– 合理设计消息格式,便于解析
## 2. 操作优化
– 使用BLPOP/BRPOP减少轮询
– 使用BRPOPLPUSH确保消息处理的可靠性
– 使用管道批量执行操作
– 对于大列表,使用LTRIM控制大小
## 3. 性能优化
– 监控队列长度,及时处理队列积压
– 优化消费者代码,提高消费速度
– 使用多个消费者并行处理消息
– 避免在列表中存储过大的消息
## 4. 可靠性优化
– 实现消息确认机制
– 设计合理的重试策略
– 定期备份队列数据
– 监控队列健康状态
## 5. 监控优化
– 监控队列长度和消费速度
– 监控消费者状态
– 监控内存使用情况
– 设置队列长度告警
通过本文档的学习,您应该掌握了Redis List类型的队列系统实战,能够在生产环境中合理使用List类型实现消息队列、任务队列等系统。在实际应用中,需要根据具体业务场景选择合适的操作命令和队列设计,确保系统的可靠性和性能。
风哥提示:Redis List类型是实现队列系统的理想选择,它提供了丰富的操作命令和阻塞机制,适合构建消息队列、任务队列等系统。在实际应用中,需要根据业务需求合理设计队列结构和消费策略。
from Redis视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
