webman中不能用数组$cache=[]做缓存,因多worker进程内存隔离导致数据不共享;必须使用webman/redis连接池,配置合理min/max连接数,统一调用redis::get/setex,key需含业务域、参数签名和版本号,并结合请求级缓存与分布式锁防雪崩。

Webman 里不能用 $cache = [] 做缓存
多 Worker 进程下,每个进程内存独立,$cache['user:1001'] 只在当前进程有效,其他请求落到别的 Worker 就读不到——这不是缓存,是假缓存。
常见错误现象包括:Cache::get() 写入后读不到、限流计数在不同进程间不累计、static::$cache 持续涨内存却无法被 GC 回收。
- 仅适用于
Worker::$processCount = 1的单进程调试场景 - 或一次请求内临时复用(如控制器中多次调用同一函数)
- 生产环境必须切换到 Redis + 连接池
必须用 webman/redis 连接池,别 new Redis()
每次请求都 new Redis() 或 redis_connect(),等于每秒新建大量 TCP 连接,很快触发 Too many open files 或 Redis 服务端报 Connection refused。
正确做法:
- 装扩展:
composer require webman/redis - 配置连接池(
config/redis.php):'pool' => ['min_connections' => 2, 'max_connections' => 20],别盲目设 100 - 业务中统一用
Redis::get($key)/Redis::setex($key, $ttl, $value),底层自动取放连接 - 绝对不要在
onWorkerStart里 new 一个 Redis 实例后赋给全局变量——多进程共享连接句柄会崩溃
Cache key 必须带业务域 + 参数签名 + 版本号
Redis::set('user_list', $data) 是线上事故高发点:加个分页参数、换套筛选条件、切测试环境,缓存就全乱;多个环境共用一套 Redis,key 冲突直接串数据。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
推荐结构:user:list:type_{$type}:page_'.md5(json_encode([$page,$size])).':v2
- 用
json_encode()而非serialize()做参数哈希,避免 PHP 升级导致 hash 不一致 - 显式带版本号(如
:v2),上线即生效,比KEYS user:list*更可控 - 敏感字段(如用户 ID)别明文拼进 key,可用
hash_hmac('sha256', $uid, $secret)匿名化
热门接口要防穿透:请求级缓存 + 分布式锁
缓存失效瞬间,上百并发请求同时打到数据库,就是雪崩。比如商品详情页,缓存过期后所有请求都穿透过去。
必须组合使用:
- 请求级缓存(如用
static $local_cache在单次请求内避免重复查 Redis) - 分布式锁(
Redis::setnx($lock_key, 1)+expire),只让一个请求回源加载,其余等待并复用结果 - 缓存重建时设置随机 TTL(如
3600 + rand(0, 300)),避免集体过期
Key 设计和锁粒度没对齐,或者忘了删锁,就会卡死整个业务链路——这点最容易被忽略,但影响最直接。










