在 Laravel 中使用 Redis 缓存图像?

Posted

技术标签:

【中文标题】在 Laravel 中使用 Redis 缓存图像?【英文标题】:Cache image with Redis in Laravel? 【发布时间】:2020-04-03 17:59:27 【问题描述】:

我目前正在使用 Redis 在我的 Laravel 应用程序中提供缓存内容。我注意到将它与 Cache Facade 一起使用比使用本机 Redis 命令和 other people have noticed too 慢。我想用一个实现 Redis 外观的 sn-p 替换这个 sn-p。

public function setImageCached(Request $request)

    $img = Cache::remember('image_'.$request->url, 6000, function () use ($request) 
        return file_get_contents($request->url);
    );
    
    return Response::make($img, 200, array('Content-Type' => 'image/jpeg'));

【问题讨论】:

我认为你链接的问题有这个确切的代码(但有帖子),并且还将它转换为使用 Redis 门面。也许尝试根据您自己的情况修改该示例,并让我们知道您在哪里卡住以及您尝试了什么?现在听起来你希望有人为你做这件事:) 这不是 Laravel 中文件/图像缓存的方式,这可能与性能问题有关。 laravel.com/docs/5.8/filesystem#caching IMO,Redis 不太适合图像缓存。我会为这些使用文件系统驱动程序。 @JasonResult 检查我在第一条评论中发布的链接。如果在 config.xml 中打开文件系统缓存,则不需要手动缓存每个图像。这使用任何存储驱动程序缓存方法,而不是 Laravel 的内置缓存。 哦,是的,我的错,缓存仅适用于通过 Laravel 的文件系统驱动程序存储的图像。在这种情况下,我建议使用 @ceejayoz 方法。您可以定义多个缓存驱动程序并在不同情况下使用它们,我会将 Redis 保留为默认值,然后在存储文件而不是 Cache::remember 时,使用`Cache::store('file')->remember` 来告诉它使用文件存储。 【参考方案1】:

根据 cmets 形成此答案,因此可能需要更新问题以匹配。

要在不同的上下文中使用不同的缓存驱动程序,您可以定义一个默认的缓存驱动程序(redis 最适合这个),然后使用单独的存储来存储具有以下内容的文件

Cache::store('file')->remember('image_'.$request->url, 6000, function () use ($request) 
        return file_get_contents($request->url);
);

这将使用文件系统驱动程序来缓存文件,这是 redis 用于此用途的更好解决方案。

正如您还发现的,需要注意的一点是 Laravel 不会清理过期的缓存文件。有一个包可以为你处理这个arifhp86/laravel-clear-expired-cache-file 它给你一个工匠命令

php artisan cache:clear-expired

您可以安排它尽可能频繁地运行

【讨论】:

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

在 Laravel 中使用缓存外观时未显示 Redis 键

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

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

Laravel 使用 Redis 缓存非常慢

Laravel 存储视图缓存到 Redis

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