我在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.phpuse 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查询缓存花费更多时间。
那么您有什么建议可能出了什么问题呢?
apcu
作为缓存驱动,Laravel Cache门面与直接使用apcu_get()
相比,慢了 7 倍左右。我认为这是 Laravel 使用非常严格的模式和编码规范所导致的。我认为,在速度方面,你必须打破一些规则,就像它们为数据库打破规则一样,直到他们创建了 NoSql 数据库和文件系统。今天我在我的 Mac 上尝试了 Redis 缓存,但并没有给我留下深刻印象。我想我会直接尝试 Redis。 - KeitelDOG