ThinkPHP6多模块缓存需按模块隔离,否则缓存键冲突导致脏数据;可通过配置stores.default.prefix、动态setOptions或Cache::tag()实现模块前缀隔离与精准清理。

ThinkPHP6项目中多个模块共用同一套缓存驱动时,缓存键默认不带模块前缀,导致A模块改了缓存内容,B模块读到脏数据——必须按模块隔离清理,否则无法精准控制。
确认缓存是否已按模块隔离
打开 config/cache.php,检查 stores.default.prefix 配置项。若值为 'think_cache:' 或为空字符串,说明未启用模块前缀;若为 'admin_think_cache:'、'api_think_cache:' 等带模块名的字符串,则已隔离。
未配置 prefix 时,所有模块写入的缓存 key 都是 raw_key(如 user:1001),会互相覆盖。
【prefix 必须在 cache 驱动初始化前设置,运行时修改无效】
手动为模块添加缓存前缀
方法一:修改 config/cache.php 中 default store 的 prefix
将 'prefix' => 'think_cache:' 改为 'prefix' => 'admin_think_cache:',重启服务后 admin 模块所有缓存自动带前缀。
方法二:代码中动态指定前缀(适用于临时隔离)
在 Admin 模块控制器里调用:Cache::store('file')->setOptions(['prefix' => 'admin_'])->set('user:1001', $data);
注意:此方式只对当前调用生效,不改变全局配置,且不能用于标签缓存(tag 不支持运行时 prefix)。
按模块清理缓存的三种实操路径
第一步:确认当前使用的缓存驱动类型(file / redis / memcache)
第二步:根据驱动选择对应清理方式
第三步:执行清理
① file 驱动 → 进入 runtime/cache/ 目录 → 找到以模块前缀命名的子目录(如 admin/、api/)→ 删除整个子目录
② redis 驱动 → 使用 redis-cli 登录 → 执行 KEYS "admin_*" → 再执行 DEL key1 key2 ...(不推荐 KEYS,生产环境用 SCAN)
③ redis 驱动(安全方式)→ 在命令行执行:
php think cache:clear --type=redis --prefix=admin_
tp6.1+ 支持 --prefix 参数,它会调用 Redis::getKeys() + Redis::delete() 组合,避免 KEYS 全库扫描阻塞。
用标签实现模块级缓存隔离与清理
无需改 prefix,直接用 Cache::tag() 绑定模块标识:
Cache::tag('admin_user')->set('profile', $data, 3600);
Cache::tag('api_order')->set('list', $list, 1800);
清理时只需:Cache::tag('admin_user')->clear();
这一步操作起来很简单,直接在控制器或命令行类里调用即可,不影响其他模块缓存。
注意:apc/xcache 驱动不支持 tag,仅 file 和 redis 可用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











