php redis扩展未启用是连接失败的主因,需用php -m验证并正确安装;连接需设超时、强制ipv4;存数组对象须序列化;防缓存击穿应使用原子set nx/ex参数或分布式锁。

php-redis 扩展没装好,new Redis() 直接报错
绝大多数连不上 Redis 的问题,根本不是代码写错了,而是 PHP 根本没加载 redis 扩展。运行 php -m | grep redis,没输出就说明扩展没启用。
常见错误现象:Class 'Redis' not found、Call to undefined function redis_connect()(后者是旧版 phpredis 的函数,混淆了扩展版本)。
- Linux 下用包管理器装:Ubuntu/Debian 用
sudo apt install php-redis,CentOS 用sudo yum install php-pecl-redis,装完别忘了重启php-fpm或 Apache - Windows 下检查
php.ini是否启用了extension=php_redis.dll,且 DLL 文件在ext/目录下存在 - 用
phpinfo()页面确认 “Redis Support” 显示为 “enabled”,且版本号不是0.0
连接时超时或拒绝,connect() 返回 false 却不报具体错
Redis::connect() 默认失败只返回 false,不抛异常,也不打印错误信息,容易误判为“连上了但没数据”。必须手动检查连接状态或开启异常模式。
使用场景:本地开发连 127.0.0.1:6379 失败,但 redis-cli -h 127.0.0.1 -p 6379 ping 是通的——大概率是 PHP 进程被 SELinux / 防火墙拦截,或 Redis 配置了 bind 127.0.0.1 但 PHP 走的是 IPv6 回环(::1)。
立即学习“PHP免费学习笔记(深入)”;
- 连接后立刻调用
$redis->getLastError()查错误,比如Connection refused或Operation timed out - 显式设置超时:用
$redis->connect('127.0.0.1', 6379, 2.5),第三个参数是秒级超时,避免卡住整个请求 - IPv4 强制:如果 Redis 没开 IPv6 支持,把 host 改成
127.0.0.1而非localhost,防止 DNS 解析走::1
存数组或对象时直接 set() 报错或存成空字符串
Redis::set() 只接受字符串值。传数组、对象、null 会静默转成空字符串或触发警告(取决于 error_reporting 级别),缓存看起来“写成功”了,取出来却是空的。
性能影响:用 serialize() 最省事但慢,PHP 8.1+ 推荐 igbinary(需编译安装),JSON 更通用但不支持资源和闭包。
- 简单值(数字、字符串)直接
set() - 数组/对象必须序列化:
$redis->set('user:123', json_encode($data, JSON_UNESCAPED_UNICODE)) - 读取时反解:
json_decode($redis->get('user:123'), true),注意加true得到数组而非对象 - 别用
serialize()存带类名的数据,换环境反序列化可能失败;也别用var_export(),它不是标准序列化协议
高并发下 get() + set() 组合出现缓存击穿
典型伪代码:if (!$val = $redis->get('key')) { $val = db_query(); $redis->set('key', $val); }。当大量请求同时发现 key 不存在,会一起打到数据库,这就是缓存击穿。
Redis 本身不提供“原子性 set-if-not-exists + 返回旧值”的操作,但可以用 set() 的扩展参数模拟。
- 用
$redis->set('key', $val, ['nx', 'ex' => 3600]):只有 key 不存在时才设,且设完立刻过期,返回true/false表示是否抢到写权限 - 更稳妥的做法是加分布式锁:用
set('lock:key', '1', ['nx', 'ex' => 10])尝试上锁,成功再查 DB + 写缓存,最后del('lock:key') - 别依赖
exists()+set()两步,中间可能被其他进程插入,必须用原子命令
Redis 的 set 命令参数细节容易被忽略:PHP redis 扩展里 ['nx', 'ex' => N] 是数组形式,不是字符串 'NX EX 3600',传错格式会静默失败。











