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
相关产品推荐
相关产品推荐

