webman整合redis缓存的关键在于连接池、带版本号的key设计和请求级+分布式锁防穿透:必须用webman/redis连接池避免time_wait爆炸,key需含业务域、参数签名和版本号(如user:list:type_1:page_md5:v2),并结合请求内缓存与分布式锁防止高并发穿透。

Webman 整合 Redis 缓存,关键不在“连上就行”,而在于连接方式、Key 管理和缓存穿透防护这三处——用错 new Redis() 会炸连接数,Key 不带版本号会导致缓存脏数据长期不更新,没请求级缓存则高并发下直接打穿数据库。
别在控制器里 new Redis(),必须用 webman/redis 连接池
Webman 的 Worker 进程常驻内存,每次请求都 new Redis() 或调用 redis_connect(),会导致每个请求新建 TCP 连接,Worker 数 × 并发量 = 实际 Redis 连接数。轻则 TIME_WAIT 堆积,重则 Redis 拒绝新连接(报错 Connection refused 或 Too many open files)。
正确做法是交由连接池管理:
- 安装:
composer require webman/redis - 配置
config/redis.php中的'pool' => ['min_connections' => 2, 'max_connections' => 20],避免空闲连接过多或高峰时取不到连接 - 业务中直接调用
Redis::get('key'),底层自动从池中取可用连接,用完归还 - 禁止在
onWorkerStart里new Redis()后赋值给全局变量——多进程间无法共享资源,且序列化失败风险高
Cache key 必须含业务域、参数签名和版本号
写死 Cache::set('user_list', $data) 是最常见也最危险的 Key 设计。环境混用、逻辑变更、缓存污染全由此引发。
一个安全可维护的 Key 应该像这样构造:
user:list:type_{$type}:page_'. md5(json_encode([$page, $size])) .':v2
说明:
-
user:list是业务域,区分模块和操作类型 -
type_{$type}和page_...是参数签名,用json_encode+md5,比serialize()更稳定(PHP 版本升级不破坏哈希) -
v2是缓存版本号,逻辑变更时只需改 v2 → v3,旧数据自然失效,比遍历删 key 更可控 - 敏感字段如用户 ID 不直接拼进 Key,防缓存探测(比如通过枚举
user:1、user:2推断存在性)
用请求级缓存 + 分布式锁防穿透,不能只靠 Redis 过期
当缓存 miss,又遇到大量并发请求同一 Key(例如热门商品 ID=1001),所有请求都会穿透到数据库,造成雪崩。仅设 setex 过期时间解决不了这个问题。
Webman 可利用其单请求生命周期做两级防护:
- 第一级:请求内缓存,用
context()->get('cache')或静态变量暂存本次请求已查过的 key,避免同请求重复查库 - 第二级:Redis 缓存,供跨请求复用;但首次生成时需加分布式锁(如
Redis::setnx($lock_key, 1)+expire),确保只有一个请求去查库并回填缓存 - 注意锁 key 要独立于业务 key,且必须设过期时间,防止锁残留导致死锁
连 AWS ElastiCache 或阿里云 Redis 集群要填全主节点地址
填错集群地址是 Webman 连云 Redis 最常卡住的地方。报错 Couldn't map cluster keyspace using any provided seed,不是配置写错了,而是客户端没走对协议路径。
ElastiCache 集群模式(Cluster Mode Enabled)必须使用 PHPRedis 的 RedisCluster 类,并提供全部主节点地址:
- 进 AWS 控制台 → ElastiCache → 集群 → Nodes 标签页 → 复制所有
Primary节点的 Endpoint(如my-cluster.xxxxxx.ng.0001.use1.cache.amazonaws.com:6379) -
config/redis.php中clusters数组要列全这些地址,不能只填一个 proxy 地址 -
password字段留空(ElastiCache 集群默认不支持 AUTH),database必须为0(集群不支持 SELECT) - 确认服务器能
telnet通每个节点地址和端口(检查安全组、VPC 路由、网络 ACL)
真正容易被忽略的是:云厂商控制台给的「Configuration Endpoint」或「连接地址」本质是代理,只适用于单节点模式;集群模式下必须绕过它,直连分片节点。这点不搞清,调三天也连不上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











