Laravel 使用 Redis 缓存非常慢

Posted

技术标签:

【中文标题】Laravel 使用 Redis 缓存非常慢【英文标题】:Laravel Caching with Redis is very slow 【发布时间】:2019-04-01 12:03:02 【问题描述】:

我正在 Laravel 上使用 Redis 迈出第一步,我发现了一些奇怪的东西。

在我的设置中使用 Redis 作为缓存驱动程序时,加载页面需要很长时间。

我怎么知道?当不使用 Cache 门面但直接使用 Redis 门面时,响应时间只是一小部分。我从头开始安装 laravel,并为简单的 Article 模型构建了迁移和播种器。

首先我认为这些项目没有存储在 redis 中,因为 redis-cli 在使用 KEYS * 搜索时没有显示它们。我发现缓存存储在另一个数据库中,REDIS_CACHE_DB 位于 config/database.php 中 `redis-cli 中的 INFO 键空间列出了这两个名为 0 和 1 的 DB。

我认为问题可能是由我使用 Mamp Pro 设置的本地主机引起的。所以我切换到 Laravel Homestead 盒子并在那里上传了我的项目。同样在这里。

这是我正在使用的代码: 路线/web.php

use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Cache;
use Illuminate\Http\Request;
use App\Article;

Route::get('/get-articles-mysql', function (Request $request) 
    return response()->json(Article::take(20000)->get());
);


Route::get('/get-articles-cache', function (Request $request) 
    return Cache::remember('posts', 60, function () 
        return Article::take(20000)->get();
    );

);

Route::get('/get-articles-redis', function (Request $request) 
    if($posts = Redis::get('posts.all')) 
        return response()->json(json_decode($posts));
    

    $posts = Article::take(20000)->get();
    Redis::set('posts.all', Article::take(20000)->get());
    return response()->json($posts);

);

我正在使用邮递员来获取响应时间。我进行了几次运行,因为当缓存为空时,缓存路由在第一次请求时应该很慢。但我平均得到的是:

http://laravel-echo.local/get-articles-mysql 583ms
http://laravel-echo.local/get-articles-redis 62ms
http://laravel-echo.local/get-articles-cache 730ms

我不明白。 直接使用 Redis 门面非常快。但是为什么缓存这么慢?是的,我仔细检查了我的 .env 文件。有 CACHE_DRIVER=redis 所以我不是偶然使用文件系统的。并且我同时使用了php artisan config:clearphp artisan cache:clear 以避免调试时出错。

我在 redis-cli 中看到一个名为“laravel_cache:posts”的键。缓存的帖子在那里。加载它们只需要很长时间。我还在 Chrome 中测试了请求。响应时间要长得多,但缓存需要的不仅仅是 mysql 查询。

那么有什么建议可以在这里发生吗?

【问题讨论】:

我也怀疑这一点。如何?我曾经使用 apcu 作为缓存驱动程序,而 Laravel Cache 外观比直接使用 apcu_get() 慢 7 倍。我想 Laravel 使用的非常严格的模式和编码规范是负责任的。我认为当谈到速度时,你必须打破一些规则,就像他们为数据库打破规则一样,直到他们创建 NoSql 和文件系统。今天我在我的 Mac 上尝试了 Redis 缓存,并没有给我留下那么深刻的印象。我客人我会直接用Redis试试。 面临同样的问题...laravel 缓存与 redis 似乎很慢 与 Laravel 6.12 相同 20.000 篇文章和“慢”我认为这里有关联:) 我也遇到了同样的问题,所以我使用了 Redis 外观,它的工作原理就像魅力一样。 【参考方案1】:

我知道这个帖子已经很老了,但我还是老样子。

我正在使用 Laragon 进行本地开发,Redis 使我的 API 请求速度慢了 4 倍。

编辑:

OMFG...我只是问题所在。

在我的 .env 文件中,我有“REDIS_HOST=localhost”,这正是问题所在。

我将其更改为“REDIS_HOST=127.0.0.1”后,一切都运行得很快。

试试看,然后告诉我。

【讨论】:

以上是关于Laravel 使用 Redis 缓存非常慢的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Redis 和 Laravel 5.3 在私有频道上广播通知

Laravel Redis 缓存

Laravel 中使用 Redis 锁解决缓存击穿问题

Laravel 中使用 Redis 锁解决缓存击穿问题

Laravel 存储视图缓存到 Redis

Redis 连接 [缓存] 未配置 laravel 错误