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

Laravel 5.6:Cache::rememberForever使用变量缓存键不生效问题

排查Laravel 5.6中Memcached缓存变量键名失效的问题

嘿,我之前也踩过类似的坑,咱们一步步拆解可能的原因,应该能快速定位问题:

1. 先确认变量生成的键名是否稳定且合法

Memcached对键名有严格限制:

  • 只能包含字母、数字、下划线、连字符
  • 长度不能超过250字节
  • 不能包含空格、换行、回车、null字符,也不能以:开头(Laravel自身会用冒号做命名空间分隔)

你可以在缓存代码前加一行打印,看看每次请求的键名是不是一致、有没有违规字符:

$yourKey = "user_{$userId}";
// 打印键名和长度,排查问题
dd($yourKey, strlen($yourKey));

$users = Cache::remember($yourKey, 60, function() {
    return DB::table('users')->get();
});

如果每次键名都不一样(比如$userId是动态变化的请求参数),那缓存自然不会命中;如果键名包含违规字符,Memcached会直接忽略这个缓存请求。

2. 检查变量是否被意外修改

有时候我们会在定义键名后,不小心修改了变量的值,导致最终传入缓存的键名和预期不符。比如:

$key = "order_{$orderId}";
// 中间某段代码修改了$orderId的值
$orderId = request('new_order_id');
// 此时缓存键名已经不是原来的order_xxx了
$order = Cache::remember($key, 60, function() use ($orderId) {
    return DB::table('orders')->find($orderId);
});

这种情况很隐蔽,一定要确认键名定义后,变量没有被后续逻辑篡改。

3. 过长键名的处理

如果你的变量生成的键名超过250字节,Memcached会拒绝存储这个缓存。这种情况可以用哈希函数把键名转换成固定长度的合法字符串,比如:

// 用md5哈希生成固定长度的键名,避免过长或特殊字符问题
$key = "user_data_" . md5($user->email . $user->id);

$userData = Cache::remember($key, 1800, function() use ($user) {
    return $user->profile()->get();
});

4. 测试固定变量值验证

你可以暂时把变量手动赋值成固定值,比如:

$key = "user_123"; // 固定值,代替原来的变量
$user = Cache::remember($key, 60, function() {
    return DB::table('users')->find(123);
});

如果这样能正常缓存,那100%是你的变量生成的键名有问题;如果还是不行,再去检查Memcached的配置(但你用test键能正常缓存,所以大概率不是配置问题)。


内容的提问来源于stack exchange,提问作者Miranda Roberts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:14:45