我这个缓存 哪儿写的不对吗?

        $key='code';
        if(Cache::has($key)){
            return $this->success(Cache::get($key));
        }else{
            Cache::put($key, ['2423'], 10);
            return $this->success(Cache::get($key));
        }

为什么每次请求都是走else 理论上短时间重复请求 应该走if呀?
:sob: :sob: :sob: :sob:

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

另外看你的代码像是验证码相关的 那么建议为每个用户加一些内容, 比如 user.1.code 或者使用 session 代替
因为缓存是全局性的 假设两个用户同时访问那么验证码就会被第二个用户刷掉从而导致第一个用户验证失败

1年前 评论
tiantian10000 (楼主) 1年前
讨论数量: 20

5.7和之前的版本,第三个时间参数单位是分钟,从5.8开始单位改成秒了,如果你两次请求间隔大于10秒,那上次的缓存就失效了,自然走的else

另外你这种需求应该使用Cache::remember方法,它会自动判断如果缓存有值就直接返回,如果没有就执行闭包,把结果缓存起来供后续使用并返回结果

$value = Cache::remember($key, 10, function () {
    return ['2423'];
});
1年前 评论
tiantian10000 (楼主) 1年前
lchola (作者) 1年前
Benn888 1年前

我有个项目的解决方案是在default里put
来上代码, 希望对你有所帮助:

Cache::get($key, function() {
    Cache::put($key, $value);
    return $value;
});
1年前 评论
tiantian10000 (楼主) 1年前

另外看你的代码像是验证码相关的 那么建议为每个用户加一些内容, 比如 user.1.code 或者使用 session 代替
因为缓存是全局性的 假设两个用户同时访问那么验证码就会被第二个用户刷掉从而导致第一个用户验证失败

1年前 评论
tiantian10000 (楼主) 1年前
$value = Cache::remember($key, 10, function () {
    return null;
});

会缓存击穿

1年前 评论
tiantian10000 (楼主) 1年前
tiantian10000 (楼主) 1年前
ncccc1 (作者) 1年前
mouyong

github.com/mouyong/php-support/blo... 用上?

已处理如下问题:数据为 null 时不做数据缓存。数据随机缓存时长。简化使用 rememberrememberForever,还有 forget get pull 等常用函数也可以直接调用: LaravelCache::forget($cacheKey)

$model = LaravelCache::remember($cacheKey, function () use ($value) {
    if (!$value) {
        return null;
    }

    return Model::where('field', $value)->first();
});
1年前 评论
王小大 1年前
mouyong (作者) 1年前

@ncccc1 可以将缓存时间设置成随机值

$value = Cache::remember($key, rang(10,60), function () {
    return null;
});
1年前 评论
mouyong 1年前
微加加的朋友 (作者) 1年前
mouyong 1年前

这么写

$key='code';
if(( $data = Cache::get($key))  == null) {
    $data =  ['2423'];
    Cache::put($key, $data, 10);
}
return $this->success($data);
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!