使用Redis进行Laravel缓存非常缓慢

14

我在Laravel上使用Redis作为缓存驱动程序时发现了一些奇怪的问题。

如何知道?当不使用Cache facade而直接使用Redis facade时,响应时间只是一小部分。我在scratch上设置了一个laravel安装程序,并为简单的Article模型构建了migration和seeder。

起初我以为项目没有存储在redis中,因为当使用KEYS *进行搜索时,redis-cli没有显示它们。 我发现缓存存储在另一个带有REDIS_CACHE_DB的DB中,如config/database.php中所找到的那样。 `INFO键空间在redis-cli中列出了这两个名为0和1的DB。

我认为问题可能是由我的localhost设置与Mamp Pro导致的。 因此,我切换到Laravel Homestead box并将我的项目上传到那里。 结果还是一样。

这里是我正在使用的代码:

routes/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);

});
我正在使用Postman来获取响应时间。由于在缓存为空时缓存路由应该很慢,所以我进行了多次运行。但是平均而言我得到的结果是这样的:
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 facade直接使用非常快,但缓存为什么会如此缓慢? 我确认了我的.env文件,其中CACHE_DRIVER=redis,所以我没有意外地使用文件系统。在调试时,我还使用了php artisan config:clear和php artisan cache:clear来避免错误。

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

那么您有什么建议可能出了什么问题呢?


2
我也有同样的怀疑。如何呢?我曾使用 apcu 作为缓存驱动,Laravel Cache门面与直接使用 apcu_get() 相比,慢了 7 倍左右。我认为这是 Laravel 使用非常严格的模式和编码规范所导致的。我认为,在速度方面,你必须打破一些规则,就像它们为数据库打破规则一样,直到他们创建了 NoSql 数据库和文件系统。今天我在我的 Mac 上尝试了 Redis 缓存,但并没有给我留下深刻印象。我想我会直接尝试 Redis。 - KeitelDOG
1
面对相同的问题...使用 Redis 进行 Laravel 缓存似乎很慢。 - akash varlani
同样适用于 Laravel 6.12。 - Sliq
2万篇文章和“慢”这两者之间应该有关联 :) - hakkikonu
我也遇到了同样的问题,所以我使用了 Redis 外观(facade),它非常好用。 - Niyanta Bhayani
1个回答

5

我知道这个帖子已经很老了,但我仍然遇到同样的问题。

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

编辑:

天哪...我找到问题了。

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

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

试试看,然后告诉我结果。


非常感谢您提供解决方案!虽然我不是在本地主机上工作,但慢速DNS解析也是我的问题所在! - Mouagip
这个效果非常好! - Felix Bernhard
这个简直太棒了! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接