You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel缓存疑问:Cache::remember未按预期更新缓存求助

Laravel缓存不自动更新问题排查(Cache::remember + Redis驱动)

一、Cache::remember核心工作逻辑

Cache::remember($key, $ttl, $callback)的执行流程:

  1. 检查Redis中是否存在指定$key的有效缓存(未过期)
  2. 存在则直接返回缓存数据;不存在/已过期则执行$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:15:36