目录一、Redis 简介二、Redis 核心特点三、Redis 常用数据结构3.1 String字符串3.2 Hash哈希3.3 List列表3.4 Set集合3.5 Sorted Set有序集合四、Redis Stream消息队列4.1 基本命令4.2 消费者组4.3 Stream 与 List 的对比五、Redis 在项目中的典型用法5.1 架构示意5.2 MAF 营销分析任务流5.3 消费者组带来的好处5.4 Redis Stream 请求分发规则六、Redis 常用配置七、Python 操作 Redis7.1 Linux安装7.2 Docker安装7.3 连接Redis7.4 基本使用八、Redis 使用建议总结一、Redis 简介RedisRemote Dictionary Server是一个基于内存的键值存储系统支持多种数据结构常被用作缓存、消息队列和会话存储。它提供高性能读写并支持持久化、主从复制和集群。二、Redis 核心特点特点说明内存存储数据主要在内存中读写延迟低通常微秒级持久化支持 RDB 快照和 AOF 日志保证数据不丢失多种数据结构String、List、Hash、Set、Sorted Set、Stream、Bitmap 等单线程模型命令串行执行避免锁竞争保证原子性主从复制支持读写分离和高可用发布订阅支持 Pub/Sub 和 Stream 消息队列事务支持 MULTI/EXEC 事务Lua 脚本支持 Lua 脚本保证原子性集群支持 Redis Cluster 水平扩展三、Redis 常用数据结构3.1 String字符串SET key value # 设置 GET key # 获取 INCR key # 自增 EXPIRE key seconds # 设置过期时间3.2 Hash哈希HSET user:1 name 张三 age 25 HGET user:1 name HGETALL user:13.3 List列表LPUSH queue task1 # 左侧入队 RPOP queue # 右侧出队 LRANGE queue 0 -1 # 范围查询3.4 Set集合SADD tags redis cache SMEMBERS tags SISMEMBER tags redis3.5 Sorted Set有序集合ZADD rank 100 user1 95 user2 ZRANGE rank 0 -1 WITHSCORES ZREVRANK rank user1四、Redis Stream消息队列Redis 5.0 引入 Stream用于实现消息队列支持消息持久化消费者组消息确认ACK历史消息回溯4.1 基本命令# 添加消息 XADD mystream * field1 value1 field2 value2 # 读取消息从头 XREAD COUNT 10 STREAMS mystream 0 # 读取最新消息阻塞 XREAD BLOCK 5000 STREAMS mystream $4.2 消费者组# 创建消费者组 XGROUP CREATE mystream mygroup 0 MKSTREAM # 消费消息 XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream # 确认消息 XACK mystream mygroup message-id # 查看待确认消息 XPENDING mystream mygroup4.3 Stream 与 List 的对比特性ListStream消息持久化有有消费者组无有消息确认无有历史回溯有限支持适用场景简单队列可靠消息队列五、Redis 在项目中的典型用法以银行场景下的 SOP 合规检测为例Redis Stream 用于任务分发和结果回传。5.1 架构示意后端/前端 → XADD 推送任务 → Redis Stream↓sop_engine 监听 XREADGROUP↓处理完成后 XADD 推送结果↓后端消费 message:xxx:results5.2 MAF 营销分析任务流# 1. 推送 MAF 任务 XADD message:maf:tasks * task_id maf_001 \ conversation_id maf_001 \ conversation_json_path bucket/path/conversation.json # 2. 引擎监听 message:maf:tasks消费并分析 # 3. 引擎完成后写入结果流 XADD message:maf:results * task_id maf_001 status completed \ result_path maf-results-bucket/maf_001/analysis_result.json5.3 消费者组带来的好处多个 worker 共同消费实现负载均衡每条消息只被组内一个消费者处理支持 ACK失败可重试支持 PELPending Entries List查看未确认消息5.4 Redis Stream 请求分发规则如果两个项目使用了同一套Redis配置那么无法保证Redis Stream 请求会由谁处理取决于 Redis 消费者组的分发。两个容器都连同一个 Redis监听同一个 Stream如 message:maf:tasks且通常在同一消费者组如 maf_analyze_group里Redis 会把消息分发给组内的消费者每条消息只会被组内一个消费者处理具体是容器 1 还是容器 2由 Redis 的分发策略决定无法指定因此有时是A容器处理有时是B容器处理测试时无法稳定地“只让某个容器”处理请求可能带来的问题场景说明代码版本混用同一批任务部分由旧代码处理部分由新代码处理测试不可控无法保证测试请求一定打到新容器任务重复若消费者组配置不当可能出现同一条消息被多个消费者处理如何保证只使用新代码方案 1停掉旧容器# 停掉旧容器后再部署新容器 docker stop old_container_id docker run ... # 启动新容器方案 2用不同的 Stream 做测试新容器监听不同的 Stream例如 message:maf:tasks_test测试时往 message:maf:tasks_test 发消息需要改配置或环境变量让新容器使用 message:maf:tasks_test方案 3用不同的消费者组新容器使用不同的消费者组名例如 maf_analyze_group_v2两个组都会收到同一条消息各自处理一次适合做 A/B 或灰度但会产生重复处理需要业务上能接受方案 4只保留一个容器部署新容器前先停掉旧容器或使用滚动更新保证同一时间只有一个版本在跑六、Redis 常用配置# 绑定地址 bind 0.0.0.0 # 端口 port 6379 # 密码 requirepass your_password # 最大内存 maxmemory 2gb maxmemory-policy allkeys-lru # 持久化 save 900 1 save 300 10 save 60 10000 appendonly yes七、Python 操作 Redis7.1 Linux安装# Ubuntu/Debian sudo apt update sudo apt install redis-server # CentOS/RHEL sudo yum install redis # 启动服务 sudo systemctl start redis sudo systemctl enable redis # 验证 redis-cli ping # 返回 PONG 表示成功7.2 Docker安装docker run -d --name redis -p 6379:6379 redis:latest # 带密码 docker run -d --name redis -p 6379:6379 redis redis-server --requirepass yourpassword7.3 连接Redis# 本地连接 redis-cli # 带密码连接 redis-cli -a yourpassword # 远程连接 redis-cli -h host -p 6379 -a password7.4 基本使用import redis r redis.Redis(hostlocalhost, port6379, db0, password) # String r.set(name, Redis) print(r.get(name)) # Stream 添加消息 r.xadd(mystream, {task_id: 001, data: hello}) # Stream 消费 messages r.xreadgroup(mygroup, consumer1, {mystream: }, count1) for stream, msgs in messages: for msg_id, data in msgs: print(msg_id, data) r.xack(mystream, mygroup, msg_id)八、Redis 使用建议合理设置 maxmemory 和淘汰策略避免 OOM。生产环境开启 requirepass 和访问控制。使用连接池减少连接开销。对热点 key 做拆分或本地缓存减轻压力。使用 Pipeline 批量执行命令降低网络往返。Stream 场景下注意消费者组和 ACK避免消息堆积和重复消费。总结Redis 适合做缓存、会话存储和消息队列。Stream 在需要可靠消费、负载均衡和消息确认的场景中比简单 List 更合适。结合具体业务如 MAF 任务流可以设计出清晰、可扩展的异步处理架构。
Redis 入门与实践:从基础到 Stream 消息队列
目录一、Redis 简介二、Redis 核心特点三、Redis 常用数据结构3.1 String字符串3.2 Hash哈希3.3 List列表3.4 Set集合3.5 Sorted Set有序集合四、Redis Stream消息队列4.1 基本命令4.2 消费者组4.3 Stream 与 List 的对比五、Redis 在项目中的典型用法5.1 架构示意5.2 MAF 营销分析任务流5.3 消费者组带来的好处5.4 Redis Stream 请求分发规则六、Redis 常用配置七、Python 操作 Redis7.1 Linux安装7.2 Docker安装7.3 连接Redis7.4 基本使用八、Redis 使用建议总结一、Redis 简介RedisRemote Dictionary Server是一个基于内存的键值存储系统支持多种数据结构常被用作缓存、消息队列和会话存储。它提供高性能读写并支持持久化、主从复制和集群。二、Redis 核心特点特点说明内存存储数据主要在内存中读写延迟低通常微秒级持久化支持 RDB 快照和 AOF 日志保证数据不丢失多种数据结构String、List、Hash、Set、Sorted Set、Stream、Bitmap 等单线程模型命令串行执行避免锁竞争保证原子性主从复制支持读写分离和高可用发布订阅支持 Pub/Sub 和 Stream 消息队列事务支持 MULTI/EXEC 事务Lua 脚本支持 Lua 脚本保证原子性集群支持 Redis Cluster 水平扩展三、Redis 常用数据结构3.1 String字符串SET key value # 设置 GET key # 获取 INCR key # 自增 EXPIRE key seconds # 设置过期时间3.2 Hash哈希HSET user:1 name 张三 age 25 HGET user:1 name HGETALL user:13.3 List列表LPUSH queue task1 # 左侧入队 RPOP queue # 右侧出队 LRANGE queue 0 -1 # 范围查询3.4 Set集合SADD tags redis cache SMEMBERS tags SISMEMBER tags redis3.5 Sorted Set有序集合ZADD rank 100 user1 95 user2 ZRANGE rank 0 -1 WITHSCORES ZREVRANK rank user1四、Redis Stream消息队列Redis 5.0 引入 Stream用于实现消息队列支持消息持久化消费者组消息确认ACK历史消息回溯4.1 基本命令# 添加消息 XADD mystream * field1 value1 field2 value2 # 读取消息从头 XREAD COUNT 10 STREAMS mystream 0 # 读取最新消息阻塞 XREAD BLOCK 5000 STREAMS mystream $4.2 消费者组# 创建消费者组 XGROUP CREATE mystream mygroup 0 MKSTREAM # 消费消息 XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream # 确认消息 XACK mystream mygroup message-id # 查看待确认消息 XPENDING mystream mygroup4.3 Stream 与 List 的对比特性ListStream消息持久化有有消费者组无有消息确认无有历史回溯有限支持适用场景简单队列可靠消息队列五、Redis 在项目中的典型用法以银行场景下的 SOP 合规检测为例Redis Stream 用于任务分发和结果回传。5.1 架构示意后端/前端 → XADD 推送任务 → Redis Stream↓sop_engine 监听 XREADGROUP↓处理完成后 XADD 推送结果↓后端消费 message:xxx:results5.2 MAF 营销分析任务流# 1. 推送 MAF 任务 XADD message:maf:tasks * task_id maf_001 \ conversation_id maf_001 \ conversation_json_path bucket/path/conversation.json # 2. 引擎监听 message:maf:tasks消费并分析 # 3. 引擎完成后写入结果流 XADD message:maf:results * task_id maf_001 status completed \ result_path maf-results-bucket/maf_001/analysis_result.json5.3 消费者组带来的好处多个 worker 共同消费实现负载均衡每条消息只被组内一个消费者处理支持 ACK失败可重试支持 PELPending Entries List查看未确认消息5.4 Redis Stream 请求分发规则如果两个项目使用了同一套Redis配置那么无法保证Redis Stream 请求会由谁处理取决于 Redis 消费者组的分发。两个容器都连同一个 Redis监听同一个 Stream如 message:maf:tasks且通常在同一消费者组如 maf_analyze_group里Redis 会把消息分发给组内的消费者每条消息只会被组内一个消费者处理具体是容器 1 还是容器 2由 Redis 的分发策略决定无法指定因此有时是A容器处理有时是B容器处理测试时无法稳定地“只让某个容器”处理请求可能带来的问题场景说明代码版本混用同一批任务部分由旧代码处理部分由新代码处理测试不可控无法保证测试请求一定打到新容器任务重复若消费者组配置不当可能出现同一条消息被多个消费者处理如何保证只使用新代码方案 1停掉旧容器# 停掉旧容器后再部署新容器 docker stop old_container_id docker run ... # 启动新容器方案 2用不同的 Stream 做测试新容器监听不同的 Stream例如 message:maf:tasks_test测试时往 message:maf:tasks_test 发消息需要改配置或环境变量让新容器使用 message:maf:tasks_test方案 3用不同的消费者组新容器使用不同的消费者组名例如 maf_analyze_group_v2两个组都会收到同一条消息各自处理一次适合做 A/B 或灰度但会产生重复处理需要业务上能接受方案 4只保留一个容器部署新容器前先停掉旧容器或使用滚动更新保证同一时间只有一个版本在跑六、Redis 常用配置# 绑定地址 bind 0.0.0.0 # 端口 port 6379 # 密码 requirepass your_password # 最大内存 maxmemory 2gb maxmemory-policy allkeys-lru # 持久化 save 900 1 save 300 10 save 60 10000 appendonly yes七、Python 操作 Redis7.1 Linux安装# Ubuntu/Debian sudo apt update sudo apt install redis-server # CentOS/RHEL sudo yum install redis # 启动服务 sudo systemctl start redis sudo systemctl enable redis # 验证 redis-cli ping # 返回 PONG 表示成功7.2 Docker安装docker run -d --name redis -p 6379:6379 redis:latest # 带密码 docker run -d --name redis -p 6379:6379 redis redis-server --requirepass yourpassword7.3 连接Redis# 本地连接 redis-cli # 带密码连接 redis-cli -a yourpassword # 远程连接 redis-cli -h host -p 6379 -a password7.4 基本使用import redis r redis.Redis(hostlocalhost, port6379, db0, password) # String r.set(name, Redis) print(r.get(name)) # Stream 添加消息 r.xadd(mystream, {task_id: 001, data: hello}) # Stream 消费 messages r.xreadgroup(mygroup, consumer1, {mystream: }, count1) for stream, msgs in messages: for msg_id, data in msgs: print(msg_id, data) r.xack(mystream, mygroup, msg_id)八、Redis 使用建议合理设置 maxmemory 和淘汰策略避免 OOM。生产环境开启 requirepass 和访问控制。使用连接池减少连接开销。对热点 key 做拆分或本地缓存减轻压力。使用 Pipeline 批量执行命令降低网络往返。Stream 场景下注意消费者组和 ACK避免消息堆积和重复消费。总结Redis 适合做缓存、会话存储和消息队列。Stream 在需要可靠消费、负载均衡和消息确认的场景中比简单 List 更合适。结合具体业务如 MAF 任务流可以设计出清晰、可扩展的异步处理架构。