Redis 是什么

三层设计 纯内存操作 微秒级读写 重启即丢失 需要持久化 单线程事件循环 无锁竞争 无上下文切换 一个慢查询堵全部 IO 多路复用 单线程处理高并发 RESP 协议 任何语言均可连接 不适合做 复杂查询 唯一事实来源 持久化存储
核心定位

高频读写 + 低延迟 +
数据可丢可重建

典型场景
缓存 队列 会话 计数器 分布式锁
不适用的场景
文章内容 用户主数据 订单 复杂联表查询

核心数据结构

类型 底层结构 典型场景 常用命令
String SDS(动态字符串) 序列化对象缓存、计数器、分布式锁 GET/SET INCR
Hash 哈希表 / 压缩列表 对象字段(用户信息),比 JSON 省空间 HGET/HSET HINCRBY
List 双向链表 / 快速列表 消息队列、最新动态时间线 LPUSH/RPOP LRANGE
Set 哈希表 / 整数集合 去重、标签、共同好友 SADD SINTER
Sorted Set 跳表 + 哈希表 排行榜、延迟队列、按时间排序 Feed ZADD ZRANGE
常见误区:全用 String 存 JSON

user:1001 → {"name":"张三","age":28} — 单字段更新只能整条覆盖,且 key 冗余。
正确做法:用 Hashuser:1001 → {name:张三, age:28},单字段原子读写,内存更省。

持久化方式

RDB 快照

定时全量写入 dump.rdb

恢复快 文件紧凑 可能丢数据 fork 开销大
AOF 追加日志

每条写命令追加到日志文件

数据更安全 文件较大 恢复慢
混合持久化(4.0+)

RDB 快照 + AOF 增量结合

恢复快 数据安全
推荐策略

生产环境:RDB + AOF 同时开启 — RDB 做冷备,AOF 保数据不丢。
纯缓存场景(如页面片段缓存):可以关闭持久化 — 数据丢了从 DB 重新加载。

PHP 如何连接 Redis

应用框架 Laravel 缓存/队列/会话 PHP 连接层 phpredis(C扩展) Predis(纯PHP) Redis 服务 独立进程 RESP 协议 内存存储 RAM 持久化文件
phpredis 扩展

C语言编写,编译进 PHP

性能高 内存占用低 命令全覆盖 需编译 版本绑定
Predis

纯 PHP,Composer 安装

零扩展依赖 部署简单 支持集群/哨兵 性能略低
最容易踩的坑:FPM 与 CLI 读取的 php.ini 不同

网站正常 ≠ CLI 也正常。FPM 读 php.ini,CLI 读 php-cli.ini
部署脚本里如果用 php artisan,需要确认 CLI 那边扩展有没有加载。

排查链路:三步定位法

Redis 服务是否运行?
PHP 是否加载 Redis 扩展?
配置用的是 phpredis 还是 Predis?
验证命令
# 1. Redis 服务是否在运行
systemctl is-active redis

# 2. PHP CLI 是否加载了 phpredis 扩展
/usr/local/php/8.3/bin/php -r 'var_dump(class_exists("Redis"));'
# 输出 bool(false) = 扩展未加载

# 3. 确认 PHP 入口配置文件路径
/usr/local/php/8.3/bin/php --ini
常见报错对照
报错信息 真实根因 解决方向
Class "Redis" not found phpredis 扩展未加载 检查 php.ini 中的 extension=redis.so
Connection refused Redis 服务未启动或端口不对 systemctl start redis / 检查端口
网站正常,artisan 报错 FPM 和 CLI 配置文件不同 CLI 单独加载 redis 扩展

日常维护清单

  1. 部署前预检查 — 执行 php -r 'var_dump(class_exists("Redis"));' 确认扩展已加载
  2. 明确数据类型选型 — 先想数据是单字段高频更新(Hash)、需要排序(Sorted Set)还是去重(Set)
  3. 设定 Redis 定位 — 它是加速层,不是持久化主库;可丢可重建才能放心用
  4. FPM 和 CLI 配置一致性 — 部署脚本显式指定 PHP 路径和配置文件,不依赖环境变量
  5. 不要一遇报错就重启 Redis — 大多数时候 Redis 服务本身是好的,断的是 PHP 那条链路

总结:三个问题走天下

Redis 本身只是一个内存数据结构服务。PHP 通过扩展或客户端去连接它,框架再把这层连接包装成缓存、队列、会话和计数器能力。

❶ Redis 服务有没有运行?
❷ 当前 PHP 入口有没有加载 Redis 扩展?
❸ 应用配置用的是 phpredis 还是 Predis?