Laravel缓存疑问:Cache::remember未按预期更新缓存求助
Laravel缓存不自动更新问题排查(Cache::remember + Redis驱动)
一、Cache::remember核心工作逻辑
Cache::remember($key, $ttl, $callback)的执行流程:
- 检查Redis中是否存在指定
$key的有效缓存(未过期) - 存在则直接返回缓存数据;不存在/已过期则执行
$callback获取最新数据,存入Redis并设置过期时间后返回
二、针对性排查步骤
1. 验证缓存时间配置是否正确读取
先确认配置值是否真的返回5秒,在控制器方法中临时添加调试代码:
dd(config("cache-config.cache_time.last-wins"));
如果输出不是5,可能原因:
.env文件中CACHE_TIME_LAST_WINS被设置为永久(0)或超大数值cache-config.php文件路径/数组结构错误,导致配置读取失败
2. 检查Redis缓存的实际过期时间
使用redis-cli连接Redis实例,执行命令:
TTL "last-wins"
返回值说明:
-1:缓存永久有效-2:缓存不存在- 正数:剩余过期时间(秒)
若返回远大于5的数值,说明配置的TTL未生效
3. 确认查询是否真的有新数据返回
缓存过期后回调返回旧数据,可能是数据库本身没有新的符合条件的数据。临时修改代码打印最新查询结果:
public function last_win() { $freshData = GameBet::with("getGame") ->where('created_at', '<=', Carbon::now()) ->where("win", ">", 0) ->orderBy("created_at", "desc") ->orderBy("id", "desc") ->simplePaginate(25) ->toArray(); // 打印最新数据的标识(如第一条的id/created_at) dd($freshData['data'][0]['id'], $freshData['data'][0]['created_at']); return Cache::remember("last-wins", config("cache-config.cache_time.last-wins"), function () use ($freshData) { return $freshData; }); }
如果打印结果和缓存数据一致,说明数据库无新数据;若打印为新数据但缓存返回旧值,再聚焦缓存本身问题
4. 检查Redis驱动配置与可用性
确认.env中缓存驱动及Redis配置正确:
CACHE_DRIVER=redis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379
同时测试Redis基础功能:
// 写入临时缓存 Cache::put('test-key', 'test-value', 5); // 5秒后执行以下代码 dd(Cache::get('test-key'));
若5秒后test-key不存在,说明Redis驱动正常;若仍存在,需检查Redis服务是否正常、缓存驱动是否被错误覆盖
5. 排查缓存键是否被其他代码修改
检查项目中是否有其他代码使用last-wins键,比如用Cache::forever()设置永久缓存,或用Cache::put()覆盖过期时间。用Redis命令查看缓存内容与属性:
# 查看缓存内容 GET "last-wins" # 查看缓存详细信息 OBJECT encoding "last-wins"
内容的提问来源于stack exchange,提问作者ivanovcol
相关产品推荐
相关产品推荐

