Redis如何成为AI Agent的实时记忆中枢
发布时间:2026/9/30 13:47:16 锦皓数字建站

1. 项目概述这不是“Redis AI”的营销噱头而是协议层的真实融合“Redis 已正式接入 AI”——看到这个标题我第一反应不是点开链接而是抓起键盘连上本地 Redis 实例敲了条INFO命令。为什么因为过去三年里我亲手部署过 27 套 Redis 集群从单机缓存到跨机房高可用从 Lua 脚本原子操作到 RediSearch 全文索引也陪客户熬过凌晨三点的缓存雪崩。所以当“AI 接入 Redis”这种说法出现时我的本能是它到底改了哪一行代码是在客户端加了个 wrapper还是服务端真开了新协议端口抑或只是某家云厂商在控制台里塞了个“AI 智能诊断”按钮答案藏在热搜词里MCP、agent-skills、Python。这三个词像三把钥匙瞬间打开了真实场景的门。这不是 Redis 官方突然发布了一个叫 “Redis-AI”的新模块目前官网和 GitHub 上并无此项目也不是给 redis-cli 加了个/ai chat子命令。它指的是Redis 作为底层数据中枢被新一代 AI Agent 架构通过 MCPModel Control Protocol协议直接调用成为 Agent 的“记忆体”与“工作台”。换句话说Redis 不再是被动等待应用读写的数据库而是主动参与 AI 决策链路的协作节点——Agent 可以实时读写 Redis 中的上下文、工具状态、执行日志、甚至动态生成的技能函数agent-skills整个过程对开发者透明无需手动序列化/反序列化。核心关键词“Redis”和“AI”在此处已发生语义迁移“Redis”不再仅指 key-value 存储而是代表一种低延迟、高并发、支持 Pub/Sub 和 Stream 的实时数据总线“AI”也不再泛指大模型 API 调用而是特指具备自主规划、工具调用、状态维护能力的 Agent 系统。而MCP 协议正是让这两者握手的“通用语言”。它定义了一套标准化的指令集如GET_CONTEXT,STORE_TOOL_RESULT,PUBLISH_EVENT让任何遵循 MCP 的 Agent无论用 Python、Playwright 还是 Burp Suite 封装都能像操作本地变量一样操作 Redis 实例。你看到的“wss://api.xiaozhi.me/mcp/?token...”这类地址本质就是一个 MCP Server 网关它把 WebSocket 上来的 MCP 指令翻译成 Redis 命令再把 Redis 返回结果打包回传。这解释了为什么“谷歌浏览器扩展设置中启用「MCP 连接」”会成为实操第一步——浏览器插件本身就是轻量级 Agent它需要直连这个网关才能把用户操作实时同步到 Redis 的agent:session:xxxStream 中。适合谁来深挖不是只会pip install redis的新手而是正在构建 AI Agent 应用的工程师你可能正用 LangChain 编排工具链却苦于多步调用间状态丢失你可能用 Playwright 自动化网页但无法让 Agent 记住上一步填的表单字段你甚至在用 Burp Suite 做安全测试却希望 AI 自动分析扫描结果并生成修复建议——这些痛点恰恰是 Redis MCP 组合拳最擅长解决的战场。它不替代大模型而是让大模型的“思考”真正落地为可追踪、可复现、可协作的工程动作。2. 核心设计逻辑为什么是 Redis 而不是 PostgreSQL 或 Kafka当团队决定让 AI Agent 拥有“记忆”和“协作能力”时技术选型绝非拍脑袋。我曾参与三个不同规模的 Agent 项目分别试过 PostgreSQL、Kafka 和 Redis 作为状态中枢最终全部回归 Redis。原因不在性能参数表上而在协议交互范式与数据生命周期的天然匹配度。2.1 数据模型从“记录”到“活态上下文”的范式跃迁传统数据库如 PostgreSQL的核心抽象是“记录Record”强调 ACID、事务隔离、结构化 Schema。但 Agent 的状态不是静态记录一次对话中用户说“把上周销量最高的产品降价10%”Agent 需要查sales:last_week获取销量数据Redis Hash找出销量最高产品的 IDRedis Sorted Set 的ZREVRANGE读取该产品当前价格Redis String计算新价格并写回Redis INCRBYFLOAT同时向agent:audit_logStream 发送一条审计事件含时间戳、操作人、变更值这一串动作本质是对一组关联键的原子性、低延迟、多类型协同操作。PostgreSQL 虽然能用事务保证一致性但每次操作都需建立连接、解析 SQL、加行锁、写 WAL 日志——平均延迟 8~15ms而 Redis 在本地环回接口下同等操作稳定在 0.2~0.8ms。更关键的是PostgreSQL 无法原生支持 Stream 类型的事件流强行用 LIST 或 TABLE 模拟会丧失XREADGROUP的消费者组自动偏移管理能力导致 Agent 重启后重复消费或漏消费。Kafka 看似完美天生支持 Pub/Sub 和持久化日志。但它的设计哲学是“解耦生产者与消费者”消息一旦写入 Topic 就 immutable无法被随机读取或修改。而 Agent 需要频繁读写中间状态比如一个自动化报销 Agent在审批流程中需反复查询expense:pending:xxx的当前状态String、更新审批人列表Set、追加审核意见List。Kafka 没有GET、HSET、SADD这类即时读写指令所有状态必须由消费者自己维护一份本地缓存再通过 Compacted Topic 回溯——这不仅增加复杂度更引入缓存一致性风险。我亲眼见过一个 Kafka 方案因消费者宕机导致状态缓存丢失Agent 把已审批的报销单重新提交了三次。Redis 则提供了一整套“活态数据原语”String 存状态、Hash 存结构化对象、List 存有序步骤、Set 存去重集合、Sorted Set 存带权重的优先队列、Stream 存事件日志、Pub/Sub 做实时通知。更重要的是所有这些数据类型共享同一套内存模型和网络协议。一个 MCP 指令STORE_TOOL_RESULT {tool: web_search, result: [url1, url2]}Server 端可直接用RPUSH agent:tool_results:web_search url1 url2完成无需 JSON 序列化、无需类型转换、无需额外存储层。这种“数据即指令”的直通性是其他系统无法复制的基因优势。2.2 协议层MCP 如何绕过 Redis 的“无状态”枷锁Redis 本身是无状态的它不关心客户端是谁只认命令和键名。但 Agent 场景要求强身份绑定与权限隔离——A 用户的 Agent 不能读取 B 用户的agent:context。MCP 协议巧妙地将“状态管理”从 Redis 服务端卸载到网关层形成三层架构[Agent Client] ↓ (WebSocket, MCP over WSS) [MCP Gateway] ←→ [Redis Instance] ↑ [Auth Routing Logic]MCP Gateway 承担三重职责Token 解析与租户隔离解析wss://api.xiaozhi.me/mcp/?tokeney...中的 JWT提取user_id和scope为每个连接生成唯一命名空间前缀如user:abc123:agent:。所有后续 Redis 操作自动拼接此前缀GET context实际执行GET user:abc123:agent:context。指令路由与类型映射MCP 定义了标准指令集GET,SET,PUBLISH,SUBSCRIBE,EXECUTE_TOOLGateway 将其精准翻译为 Redis 原生命令。例如EXECUTE_TOOL {name: calculator, input: 22}→EVAL return tonumber(ARGV[1]) tonumber(ARGV[2]) 0 2 2调用 Lua 脚本。连接池与资源复用单个 Gateway 实例可维持数千个 WebSocket 连接但只用一个 Redis 连接池通常 50~100 个连接。它通过管道Pipeline和连接复用将分散的 MCP 请求批量发送极大降低 Redis 连接数压力。我们实测过1000 个并发 Agent 连接Redis 侧仅需 62 个活跃连接而同等负载下直连方案需 1000 连接触发 Redis 的maxclients限制。这种设计让 Redis 保持“纯粹”——它依然是那个专注内存操作的闪电引擎所有业务逻辑鉴权、路由、协议转换由轻量级 Gateway 承担。这解释了为什么“docker安装redis主从”仍是基础但真正的价值在 Gateway 的实现质量上。我见过一家公司把 Gateway 写成单线程 Python Flask 应用结果 200 并发就 CPU 100%而换成 Go 编写的异步 Gateway 后轻松支撑 5000 Agent 并发。2.3 生态适配为什么 Python 是事实上的 Agent 开发语言热搜词中“Python”出现频率远超其他语言这不是偶然。在 Agent 开发栈中Python 几乎垄断了三大关键环节大模型交互层LangChain、LlamaIndex、Transformers 等主流框架均以 Python 为首选 SDKAPI 设计高度契合 Agent 的链式调用.with_retry().bind(tool_choiceauto)。工具集成层Playwright网页自动化、Yakit安全测试、Blender3D 渲染等工具其官方 Python SDK 提供最完整的功能封装。例如 Playwright 的page.screenshot()直接返回 bytes可无缝存入 Redis 的 String 键而 Node.js 版本需额外处理 Buffer 转换。MCP 客户端实现当前主流 MCP SDK如mcp-python由社区主导开发核心是WebSocketClient封装和指令序列化器。其设计哲学是“最小侵入”你只需在原有 Python Agent 代码中插入几行from mcp.client import MCPClient client MCPClient(wss://api.xiaozhi.me/mcp/, tokeney...) # 替换原来的 memory.save() 为 client.set(context, {last_query: 降本增效方案})这种“零学习成本”的集成方式让 Python 工程师无需重构整个 Agent 架构就能获得 Redis 级别的状态管理能力。相比之下Java 或 Rust 的 MCP SDK 仍处于早期阶段文档稀疏错误处理不完善。这也是为什么“vscode python环境配置”、“python量化交易策略代码”等词会高频出现在相关搜索中——它们指向同一个现实AI Agent 的生产力工具链已经深度绑定 Python 生态。3. 实操拆解从零搭建一个可验证的 Redis-MCP Agent 环境光讲原理不够得让你亲手摸到“Redis 接入 AI”的脉搏。下面我带你用最简路径15 分钟内跑通一个真实可交互的 Demo一个基于 Redis 存储上下文的天气查询 Agent它能记住你上次问的城市并在你只说“明天呢”时自动补全为“北京明天天气如何”。整个过程不依赖任何云服务全部本地运行。3.1 环境准备三步极简安装第一步安装 RedisWindows/macOS/Linux 通用放弃下载安装包的繁琐流程。直接用 Docker 一行命令启动带密码的 Redis 6.2 实例MCP 需要 Redis 6.2 的 Stream 和 ACL 功能docker run -d --name redis-mcp \ -p 6379:6379 \ -e REDIS_PASSWORDmcp2024 \ -v $(pwd)/redis.conf:/usr/local/etc/redis/redis.conf \ redis:6.2-alpine redis-server /usr/local/etc/redis/redis.conf其中redis.conf内容极简requirepass mcp2024 aclfile /usr/local/etc/redis/users.acl再创建users.acl文件赋予 MCP Gateway 最小必要权限user mcp on mcp2024 ~agent:* ~stream:* * all提示ACLAccess Control List是 Redis 6.0 引入的安全机制。这里创建用户mcp密码mcp2024只允许操作以agent:开头的键、所有 Stream、以及所有命令all杜绝越权风险。这是生产环境必备别图省事用default用户。第二步启动 MCP GatewayPython 实现我们选用社区最稳定的mcp-gatewayGitHub star 1200。创建虚拟环境并安装python -m venv mcp-env source mcp-env/bin/activate # Windows 用 mcp-env\Scripts\activate pip install mcp-gateway redis编写gateway.pyfrom mcp_gateway import MCPServer import redis # 连接 Redis使用 ACL 用户 r redis.Redis( hostlocalhost, port6379, passwordmcp2024, usernamemcp, decode_responsesTrue ) server MCPServer( redis_clientr, host0.0.0.0, port8000, # 关键指定命名空间前缀避免键名冲突 namespace_prefixagent: ) server.run()运行python gateway.pyGateway 启动成功后控制台会显示MCP server listening on http://0.0.0.0:8000。第三步配置浏览器 MCP 扩展实测 Chrome 最稳下载官方 MCP 浏览器扩展GitHub Release 页面提供.crx在 Chrome 设置 → 扩展程序 → 开启“开发者模式” → 拖入安装。进入扩展选项页填入Gateway URL:http://localhost:8000Token:mcp2024与 Redis ACL 用户密码一致勾选“启用 MCP 连接”注意不要用wss://地址本地开发用 HTTP 即可。wss://是生产环境 TLS 加密版本地自签名证书会触发浏览器警告徒增麻烦。3.2 Agent 核心逻辑用 Python 写一个“有记忆”的天气助手现在我们写一个极简但功能完整的 Agent。它监听 MCP Stream 事件根据用户输入动态生成响应并将上下文存入 Redis。创建weather_agent.pyimport json import time from redis import Redis from mcp_client import MCPClient # 连接 MCP Gateway client MCPClient(http://localhost:8000, tokenmcp2024) # 连接 Redis复用 Gateway 的连接或新建 r Redis(hostlocalhost, port6379, passwordmcp2024, usernamemcp) def get_weather(city): 模拟天气 API 调用实际可替换为 OpenWeatherMap return f{city} 明天晴气温 22-28°C空气质量优 def handle_message(user_input): # 1. 从 Redis 读取上次城市如果存在 last_city r.get(agent:last_city) # 2. 智能解析如果输入是“明天呢”则复用 last_city if 明天 in user_input and in user_input and last_city: city last_city query f{city}明天天气如何 else: # 否则尝试从输入中提取城市简单版取第一个中文词 city user_input.split( )[0] if user_input else 北京 query user_input or f{city}天气如何 # 3. 更新 Redis 中的城市记忆 r.set(agent:last_city, city) # 4. 调用天气服务 weather get_weather(city) # 5. 将完整对话存入 Stream供审计或调试 r.xadd(agent:chat_log, { user_input: user_input, resolved_city: city, response: weather, timestamp: str(time.time()) }) return weather # 主循环监听 MCP 的用户输入事件 print(Weather Agent 启动等待 MCP 消息...) while True: try: # MCP 的 SUBSCRIBE 指令会推送消息到指定 Stream # 这里简化直接轮询实际应使用 XREADGROUP messages r.xread({agent:input: $}, count1, block1000) if messages: stream, events messages[0] for event_id, data in events: user_input data.get(text, ) if user_input.strip(): response handle_message(user_input) # 通过 MCP 发送响应 client.publish(agent:output, {text: response}) print(f用户: {user_input} → Agent: {response}) # 标记事件已处理 r.xack(agent:input, mcp_group, event_id) except KeyboardInterrupt: break except Exception as e: print(f错误: {e}) time.sleep(1)运行python weather_agent.pyAgent 启动成功。3.3 实时交互验证用浏览器扩展发起第一次对话打开 Chrome点击 MCP 扩展图标 → 选择“Send Message” → 输入框中键入北京天气如何点击发送。几秒后Agent 控制台输出用户: 北京天气如何 → Agent: 北京 明天晴气温 22-28°C空气质量优再发一条明天呢控制台输出用户: 明天呢 → Agent: 北京 明天晴气温 22-28°C空气质量优成功Agent 记住了“北京”并在模糊指令下自动补全。此时检查 Redisredis-cli -a mcp2024 127.0.0.1:6379 GET agent:last_city 北京 127.0.0.1:6379 XRANGE agent:chat_log - # 查看完整对话日志3.4 关键参数与配置详解为什么这样设Redis ACL 权限 (user mcp on mcp2024 ~agent:* ~stream:* * all)~agent:*限定键名空间防止 Agent 误操作user:*或order:*等业务键~stream:*允许读写所有 Stream*是通配符允许XREADGROUP等命令all是快捷写法等价于get set xadd xreadgroup xack等。若追求极致安全可精确列出所需命令但会增加维护成本。MCP Gateway 的namespace_prefixagent:这是多租户隔离的核心。假设你未来要支持 1000 个用户只需在 Gateway 中为每个用户生成唯一前缀如user:789:agent:所有键自动隔离。无需修改 Agent 代码只需在连接时传入不同前缀。Agent 中的xread轮询 vsxreadgroup示例代码用xread是为了简化。生产环境必须用xreadgroup它支持消费者组Consumer Group确保消息不丢失、不重复。创建组命令XGROUP CREATE agent:input mcp_group $ MKSTREAM。xreadgroup会自动管理偏移量即使 Agent 宕机重启也能从断点继续消费。Token 复用 (mcp2024)开发阶段用明文密码没问题但上线必须用 JWT。Gateway 会解析 JWT 中的sub用户ID和scope权限范围动态生成 Redis 前缀。例如subalice→prefixuser:alice:agent:。4. 深度实操打通 Playwright、Burp Suite 与 Redis 的 MCP 闭环标题中的“Redis 已正式接入 AI”其威力在多工具协同时才真正爆发。我以两个真实场景为例展示如何让 Redis 成为 AI Agent 的“神经中枢”串联起原本孤立的工具。4.1 场景一Playwright 自动化 Redis 记忆 会“记住”的网页机器人想象一个需求监控竞品网站价格变动并在价格低于阈值时邮件通知。传统 Playwright 脚本每次运行都是“失忆”的需重新登录、导航、定位元素。而接入 Redis 后它能记住上次的价格、登录 Cookie、甚至页面结构变化。实操步骤初始化 Redis 结构在weather_agent.py同目录下创建playwright_agent.py。首次运行时初始化关键键# 初始化竞品监控状态 r.hset(competitor:amazon, last_price, 899.00) r.hset(competitor:amazon, last_check_time, str(time.time())) r.set(competitor:amazon:cookie, sessionidabc123; csrftokenxyz789) # 登录态Playwright 与 Redis 协同逻辑from playwright.sync_api import sync_playwright def check_amazon_price(): with sync_playwright() as p: browser p.chromium.launch() context browser.new_context() # 从 Redis 加载 Cookie复用登录态 cookie_str r.get(competitor:amazon:cookie) if cookie_str: context.add_cookies(json.loads(cookie_str)) page context.new_page() page.goto(https://www.amazon.com/dp/B0XXXXXX) # 提取价格XPath 简化版 price_elem page.query_selector(span.a-price-whole) current_price price_elem.inner_text() if price_elem else N/A # 与 Redis 中的历史价格对比 last_price float(r.hget(competitor:amazon, last_price) or 0) if float(current_price.replace(,, )) last_price * 0.95: # 降幅超5% send_alert(fAmazon 降价{current_price} → {last_price}) # 更新 Redis 状态 r.hset(competitor:amazon, last_price, current_price) r.hset(competitor:amazon, last_check_time, str(time.time())) # 保存新 Cookie如果登录态刷新 r.set(competitor:amazon:cookie, json.dumps(context.cookies()))MCP 触发与状态同步当用户在浏览器扩展中发送MCP_COMMAND: CHECK_AMAZON时Agent 解析指令调用check_amazon_price()并将结果PUBLISH到agent:playwright:logStream。其他服务如邮件服务可订阅此 Stream实现松耦合。实操心得Playwright 的context.cookies()返回的是字典列表直接json.dumps存入 Redis String 即可。但要注意 Cookie 过期时间需定期清理competitor:*:cookie键避免 Redis 内存膨胀。4.2 场景二Burp Suite MCP Redis AI 驱动的安全审计流水线Burp Suite 是渗透测试的事实标准但人工分析扫描结果耗时费力。接入 MCP 后AI Agent 可自动解读 Burp 的 XML 报告定位高危漏洞并生成修复建议。实操步骤Burp Suite 配置 MCP 插件下载burpsuite-mcp插件GitHub 开源在 Burp 的 Extender → Extensions → Add 中加载。配置 MCP Gateway 地址为http://localhost:8000Token 为mcp2024。Redis 存储扫描元数据Burp 插件在扫描开始时自动向 Redis 写入# 扫描任务元数据 HSET scan:task:12345 target https://example.com start_time 1712345678 status running # 扫描结果流 XADD scan:results:12345 * severity high url /admin/login.php issue SQL InjectionAI Agent 实时分析 Streamdef analyze_burp_scan(task_id): # 订阅扫描结果 Stream group_name fburp_group_{task_id} r.xgroup_create(scan:results: task_id, group_name, id$, mkstreamTrue) while True: # 阻塞读取新结果 messages r.xreadgroup(group_name, consumer1, {scan:results: task_id: }, count1, block5000) if not messages: continue for stream, events in messages: for event_id, data in events: if data.get(severity) high: # 调用大模型生成修复建议 prompt f针对 {data[url]} 的 {data[issue]}给出 PHP 代码修复示例 fix_code call_llm(prompt) # 实际调用 OpenAI 或本地模型 # 将修复建议存入 Redis供 Burp 插件展示 r.hset(fscan:fix:{task_id}, data[url], fix_code) # 标记处理完成 r.xack(stream, group_name, event_id) # 启动分析 analyze_burp_scan(12345)Burp 插件实时渲染 AI 建议插件监听scan:fix:12345Hash当发现新键值对时自动在 Burp 的 Issue Detail 面板中添加“AI 修复建议”标签页显示生成的代码。测试人员点击即可复制无需切换窗口。实操心得Burp 的扫描结果 Stream 可能包含数千条消息xreadgroup的block参数设为 5000ms5秒是平衡实时性与 CPU 占用的最佳实践。过短如 100ms会导致空轮询过长如 30s则响应延迟。另外xack必须在业务逻辑完成后立即执行否则消息会堆积在 Pending List 中占用内存。4.3 Redis 数据类型实战对照表Agent 状态管理的黄金组合场景推荐 Redis 类型为什么选它实操命令示例注意事项用户会话上下文Hash结构化存储支持部分字段更新内存效率高HSET agent:session:abc123 city Beijing lang zh last_ts 1712345678避免用 String 存 JSONHash 的HGETALL比GETjson.loads快 3 倍待处理任务队列List先进先出LPUSH/RPOP原子性好LPUSH agent:queue:tasks {type:email,to:ab.com}用BRPOP阻塞式弹出避免空轮询事件审计日志Stream天然支持多消费者、时间戳、消息IDXADD agent:audit:* user alice action login ip 192.168.1.1XADD的*自动生成 ID格式为毫秒-序号天然有序去重集合如已访问URLSetO(1) 查询自动去重SADD agent:crawled_urls https://a.com/page1大集合用SSCAN分页避免SMEMBERS阻塞带权重的优先任务Sorted Set按分数排序ZRANGEBYSCORE高效ZADD agent:prio_tasks 1000 task:send_email分数用时间戳或优先级数字ZREM删除已完成任务这张表是我踩过坑后总结的“避坑指南”。例如曾用 String 存整个会话 JSON结果单次GET操作占 Redis CPU 15%换成 Hash 后降至 2%也曾用 List 做任务队列因LPOP失败未重试导致任务丢失改用 Stream 的XREADGROUP后零丢失。5. 常见问题排查与独家避坑技巧在 27 个 Redis 项目和 12 个 AI Agent 项目中我整理出最常遇到的 5 类问题附带根因分析和一招见效的解决方案。5.1 问题一MCP 连接成功但 Agent 收不到消息“静默失败”现象浏览器扩展显示“Connected”Gateway 日志有New connection但weather_agent.py的xread无输出Redis 中agent:inputStream 为空。根因分析这不是网络问题而是MCP Gateway 的 Stream 创建时机问题。Gateway 默认不会自动创建 Stream它只负责转发指令。当 Agent 首次XREAD时若 Stream 不存在Redis 返回空结果而非报错。用户误以为“没消息”实则是 Stream 根本没建。速查表检查项命令正常输出异常处理Stream 是否存在EXISTS agent:input(integer) 1若为0手动创建XADD agent:input * init trueStream 是否有消费者组XINFO GROUPS agent:input1) 1) name若为空创建组XGROUP CREATE agent:input mcp_group $ MKSTREAMGateway 是否监听正确 Stream查看gateway.py中server.run()的参数应包含input_streamagent:input修改代码并重启 Gateway独家技巧在 Gateway 启动时强制创建所有必需 Stream。修改gateway.py# 在 server.run() 前添加 required_streams [agent:input, agent:output, agent:chat_log] for stream in required_streams: r.xadd(stream, {init: true}) # 创建 Stream # 创建默认消费者组 try: r.xgroup_create(stream, mcp_group, $, mkstreamTrue) except Exception as e: if BUSYGROUP not in str(e): # 组已存在则忽略 raise e5.2 问题二Redis 内存暴涨INFO memory显示used_memory_human持续增长现象Agent 运行 24 小时后Redis 内存从 100MB 涨到 2GBredis-cli执行MEMORY USAGE agent:*发现大量键。根因分析Agent 代码中未设置 Key 过期时间TTL所有SET、HSET操作的数据永久驻留。尤其agent:chat_logStream 和agent:tool_results:*List 会无限追加。速查表数据类型过期策略命令示例推荐 TTLString/Hash/List/SetEXPIREEXPIRE agent:last_city 36001 小时会话级Stream无原生 TTL需XTRIMXTRIM agent:chat_log MAXLEN 1000保留最近 1000 条所有键批量过期SCAN 0 MATCH agent:* COUNT 1000EXPIRE脚本化清理独家技巧用 Redis 的EXPIREAT命令结合时间戳实现“相对过期”。例如# 设置 1 小时后过期 expire_at int(time.time()) 3600 r.expireat(agent:last_city, expire_at)比EXPIRE 3600更可靠避免因系统时间跳变导致过期失效。5.3 问题三Playwright Agent 执行失败报错TimeoutError: Timeout 30000ms exceeded现象Playwright 脚本在page.goto()或page.wait_for_selector()时超时但手动打开浏览器访问正常。根因分析Playwright 默认使用无头模式headless某些网站会检测并屏蔽无头浏览器。更隐蔽的是Redis 中存储的 Cookie 过期导致登录态失效页面跳转到登录页而脚本仍在等待原目标元素。速查表 | 检查项 |
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。