ThinkPHP本身不负责Redis持久化,需确保Redis服务端已启用RDB或AOF;配置时必须显式声明password(即使为空)和整数型database,避免静默失败,并隔离cache与session的prefix以防key冲突。

ThinkPHP 本身不负责 Redis 的持久化——那是 Redis 服务端的事;你真正要配的,是让 ThinkPHP 正确连接、使用 Redis,并确保它背后那个 Redis 实例已经开了 RDB 或 AOF。否则,哪怕 PHP 层写得再稳,Redis 一重启,cache() 和 session 全丢。
确认 Redis 服务端已启用持久化
这是最容易被跳过的一步:ThinkPHP 只管读写,不管落盘。必须先验证 Redis 自己是否在存数据。
- 登录宝塔面板 → 进入 Redis【设置】→ 【配置文件】,搜索
save行:如果save 900 1、save 300 10、save 60 10000全被注释(开头带#),RDB 就没开 - 搜
appendonly:如果是appendonly no,AOF 也没开 - 执行
redis-cli CONFIG GET save和CONFIG GET appendonly,看返回值是否符合预期 - 检查
/www/server/redis/dump.rdb或/www/server/redis/appendonly.aof文件修改时间是否在近期更新过
只改 ThinkPHP 配置却不碰 Redis 服务端,等于给一辆没油的车调方向盘。
ThinkPHP 中 Redis 缓存驱动必须显式声明 password 和 database
常见静默失败:缓存写不进、查不到、session 登录态秒失——往往是因为连接参数类型或缺失导致连接降级或错连到其他 DB。
立即学习“PHP免费学习笔记(深入)”;
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
password必须显式写出,即使为空:'password' => '',不能省略或设为null -
database必须是整数,比如'database' => 0,写成'database' => "0"会静默失败(phpredis 扩展不接受字符串) - 若用 Docker 或远程 Redis,
host不能只写127.0.0.1,得确认 redis.conf 中bind包含该地址,且防火墙放行port - 高并发下建议加
'persistent' => true,避免频繁建连耗尽连接数
错误示例:'database' => "1" 看似一样,但 phpredis 会忽略该配置,悄悄连到 DB 0,缓存全写错地方。
Session 接管时 prefix 隔离与原生 session 必须关闭
ThinkPHP 用 Redis 存 session,和缓存共用一个连接池时,key 冲突或机制打架会导致登录后立即登出、验证码失效等诡异问题。
- 在
config/session.php中,store设为redis后,必须单独配置'prefix' => 'sess:',和缓存的think:或空 prefix 严格区分开 - 务必关闭 PHP 原生 session 机制:
session.use_trans_sid = 0、session.auto_start = 0(写在 php.ini 或 .user.ini),否则两个 session 系统同时写 header,会报headers already sent - 不要依赖
session_set_save_handler()手动接管——ThinkPHP 6+ 的redisstore 已封装完整,额外干预反而破坏事务边界
前缀没隔离,cache('user:123') 和 session_id() 生成的 key 可能撞上,Redis DEL 操作误删 session key 是真发生过的线上事故。
缓存写入后不立即落盘?这不是 ThinkPHP 的锅
有人发现 Cache::set('foo', 'bar') 后立刻重启 Redis,foo 消失了——然后怪 ThinkPHP 没持久化。其实只是 Redis 的 RDB 还没触发,或 AOF appendfsync 设的是 everysec。
- RDB 默认策略
save 60 10000意味着:60 秒内至少 10000 次变更才落盘。测试时手动塞 1 条,根本不会生成dump.rdb - AOF 设
appendfsync always能保证每次写都落盘,但性能下降明显;everysec是平衡点,最多丢 1 秒数据 - 想立刻验证,执行
redis-cli BGSAVE(RDB)或redis-cli CONFIG SET appendonly yes+CONFIG SET appendfsync always(临时切 AOF 强同步)
ThinkPHP 不控制 Redis 的磁盘写入时机,它只管把命令发出去;后续是否落盘、何时落盘,完全取决于 Redis 服务端配置和当前负载。这点必须心里有数。


















