编程

在 Laravel 中记忆缓存

19 2025-04-25 03:24:00

当你在 Laravel 中缓存一个值时,会将其存储在缓存存储中(如 RedisMemcached 等),以便之后检索。这很好,因为它可以防止像数据库查询或 API 调用这样昂贵的操作。

use Illuminate\Support\Facades\Cache;

Cache::put('name', 'Cherika');
$name = Cache::get('name');

但是,当你在代码中多次使用缓存值时,每次调用 Cache::get() 时,你仍然会访问缓存存储。这不是免费的,因为你的缓存存储可能位于不同的服务器上,每次访问它时,它都必须进行网络调用以检索该值。

内存化驱动

要修复该问题,Laravel 现在有一个驱动用来记忆缓存值。这意味着当你从缓存中检索值时,它将会在请求期间被缓存到内存中。以这种方式,你可以多次访问缓存值,而不用每次都去访问缓存。

use Illuminate\Support\Facades\Cache;

Cache::put('name', 'Cherika');
$name = Cache::get('name'); // Hits the cache store
$name = Cache::get('name'); // Hits the cache store

$name = Cache::memo()->get('name'); // Hits the cache store
$name = Cache::memo()->get('name'); // Does not hit the cache store

如你所见,前两次的 Cache::get() 的调用命中缓存。而使用 Cache::memo()→get() 只在第一次时命中缓存,第二次调用直接从内存中检索该值。这样比再次命中内存快多了。

内存化值不会变化

当你内存化一个值时,它会在请求期间存储在内存中。这意味着,如果更改缓存存储中的值,则不会影响内存值。

use Illuminate\Support\Facades\Cache;

Cache::put('name', 'Cherika');
$name = Cache::memo()->get('name'); // Cherika

Cache::put('name', 'John Doe'); // Change the value in the cache store
$name = Cache::memo()->get('name'); // Cherika

这是为了确保内存值在整个请求过程中保持一致,这对性能和可靠性很重要。

自定义内存化驱动

默认情况下,Laravel 使用内存来缓存内存化值。也就是说内存化值在整个请求期间都保存在内存中。不过你也可以使用自定义驱动以不同方式来存储这些内存化值:

// Redis driver...
Cache::memo('redis')->get('name');

// Database driver...
Cache::memo('database')->get('name');

每个驱动获取一个唯一的内存装饰器。这意味着这些值不会在不同的驱动之间共享。

Cache::driver('redis')->put('item', 'This is in Redis');
Cache::driver('database')->put('item', 'This is in the database');

Cache::memo('redis')->get('name'); // "This is in Redis"
Cache::memo('database')->get('name'); // "This is in the database"

如果你想对记忆值使用不同的缓存策略,这可能会很方便。例如,你可能希望使用数据库驱动来记忆计算成本高昂的值,而对其他值使用默认的内存驱动。

小结

在 Laravel 中记忆缓存是提高性能和减少对缓存存储的网络调用次数的好方法。通过使用 Cache::memo() 方法,你可以在请求期间将值存储在内存中,并避免多次访问缓存存储。这对于数据库查询或 API 调用等昂贵的操作尤其有用。