Redis缓存未生效需检查cache.php中default设为'redis'且stores.redis配置正确;查询缓存优先用Cache::remember()避免并发穿透;key设计应规范防击穿雪崩;数据更新后须主动delete而非仅依赖TTL。

Redis 缓存配置没生效?检查 cache.php 的驱动和连接参数
ThinkPHP 默认不启用 Redis 缓存,即使装了 phpredis 扩展或配置了 redis 连接,cache 组件仍可能走文件缓存。关键在 config/cache.php 中的 default 和对应驱动配置。
-
default必须设为'redis',不能是'file'或留空 -
stores.redis.handler要指向真实可用的 Redis 实例:确认host、port、password(如有)、database均正确,且 PHP 可连通(用telnet或redis-cli -h xxx ping验证) - 若用 Swoole 或 CLI 模式运行,注意 Redis 连接是否被复用或提前关闭——TP 的
Redis缓存驱动默认不自动重连
Query Cache 用 Cache::remember() 还是手动 get()/set()?
对数据库查询结果做缓存,优先用 Cache::remember(),它把「查库 → 写缓存 → 返回」三步合并,避免竞态条件(如并发请求同时穿透缓存去查库)。
-
Cache::remember('user_123', 3600, function () { return Db::name('user')->find(123); });—— key 自定义、过期时间明确、闭包内只执行一次查询 - 别先
Cache::get()再手动Db::find()后Cache::set():中间有窗口期,高并发下可能多次查库 - 闭包里不要写复杂逻辑或副作用操作(如日志、发消息),否则每次缓存失效都会触发
缓存 key 设计不当导致击穿/雪崩?用业务维度 + 参数哈希组合
直接拼接 ID 或原始 SQL 当 key,容易重复、过长或含非法字符;用固定字符串(如 'user_list')又无法区分不同条件。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 推荐格式:
sprintf('user:detail:%d', $id)或md5("user:list:status={$status}:page={$page}") - 避免用未过滤的用户输入(如
$_GET['sort'])直拼 key,防止注入或 key 污染 - 对列表类查询,加随机过期时间偏移(如
3600 + rand(0, 300)),缓解缓存雪崩 - TP6.1+ 支持
Cache::tag(),但 Redis 不原生支持 tag,底层是前缀模拟,慎用于高频更新场景
数据更新后缓存没删?别只依赖「过期」,主动 Cache::delete() 更可靠
靠 TTL 自动过期看似省事,但业务上常要求「改完立刻不可见旧数据」,尤其涉及金额、状态、权限等敏感字段。
立即学习“PHP免费学习笔记(深入)”;
- 在
Db::name('user')->update()后,同步调用Cache::delete('user:detail:123') - 批量更新时,用
Cache::deleteMultiple(['user:detail:123', 'user:detail:456']),比逐个删快 - 如果更新逻辑分散在多个地方,考虑封装成事件(如
UserUpdated),监听后统一清理相关 key - 注意:TP 的
Cache::clear()是清整个 store,生产环境禁用
缓存一致性真正的难点不在写法,而在更新路径是否全覆盖——漏掉一个 save()、一个 rawQuery()、一个队列任务里的更新,就可能让前端看到脏数据。


















