对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

缓存和锁

要将MongoDB用作 Laravel 缓存和锁的后端,请通过在 config/cache.php 中指定 mongodb驱动程序来添加存储配置:

'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', 'collection' => 'cache', 'lock_connection' => 'mongodb', 'lock_collection' => 'cache_locks', 'lock_lottery' => [2, 100], 'lock_timeout' => 86400, ],],

要配置 mongodb 数据库连接,请参阅连接 MongoDB部分。

下表描述了缓存和锁选项及其默认值的列表:

设置
说明

driver

必需。 指定要使用的锁驱动程序。 必须是mongodb 。

connection

必需。 用于存储缓存项的数据库连接。 它必须是mongodb连接。

collection

默认cache 。 用于存储缓存项的 MongoDB 集合的名称。

lock_connection

默认为缓存connection 。 用于存储锁的数据库连接。 它必须是mongodb连接。

lock_collection

默认cache_locks 。 用于存储锁的 MongoDB 集合的名称。

lock_lottery

默认[2, 100] 。 修剪过期缓存项的概率为[chance, total] 。 设置为[0, 0]以禁用。

lock_timeout

默认86400 。 锁的生存时间(以秒为单位)。

从 v5.11 开始,mongodb 缓存存储支持 Laravel 的 cache.serializable_classes 配置选项。此选项限制了 Laravel Integration 在从 MongoDB 读取缓存值时可以实例化的类。

在 config/cache.php 文件的顶层配置 serializable_classes 选项,如下面的示例所示:

'serializable_classes' => [ App\Models\Payment::class,],

serializable_classes 选项接受以下值:

  • null:Laravel 集成可以实例化任何类。这是默认值。

  • false:该集成无法实例化类。它将缓存的对象作为 __PHP_Incomplete_Class 实例返回。

  • 类名数组:集成只能实例化列表中的类。它将其他类的缓存对象作为 __PHP_Incomplete_Class 实例返回。

集成到 MongoDB 中的TTL 索引会在文档过期时自动删除它们。 对于mongodb驱动程序来说,它们的使用是可选的,但建议使用。 索引通过将删除过期文档的工作委托给 MongoDB 而不是要求应用程序执行此任务来提供更好的性能。

通过调用缓存和锁存储提供的createTTLIndex()方法的迁移来创建索引:

<?php use Illuminate\Database\Migrations\Migration;use Illuminate\Support\Facades\Cache; return new class extends Migration{ public function up(): void { $store = Cache::store('mongodb'); $store->createTTLIndex(); $store->lock('')->createTTLIndex(); }};

然后运行迁移:

php artisan migrate

或者,您可以使用MongoDB Shell ( mongosh ) 创建索引:

db.cache.createIndex( /* Field that holds the expiration date */ { expires_at: 1 }, /* Delay to remove items after expiration */ { expireAfterSeconds: 0 })

如果使用锁,请通过将概率设置为 来禁用lock_lottery 0:

'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', 'lock_lottery' => [0, 100], // Disabled ],],

Laravel 缓存可用于存储任何使用Illuminate\Support\Facades\Cache门面的可序列化数据。

此示例将执行以下动作:

  • 使用mongodb存储获取缓存存储库

  • 尝试读取并返回名为 foo

  • 如果缺失,则调用闭包来计算值,永久存储该值并将其返回

use Illuminate\Support\Facades\Cache; $value = Cache::store('mongodb')->get('foo', function () { return [1, 2, 3];});

默认情况下,缓存的对象不会过期。 但是,可以定义过期时间,如以下示例所示:

Cache::store('mongodb')->set('foo', 'abc', '1 day');

如果之前已初始化值,则还支持递增和递减该值。 以下示例将计数器初始化为3 、添加5和删除2 。

Cache::store('mongodb')->set('counter', 3);Cache::store('mongodb')->increment('counter', 5);Cache::store('mongodb')->decrement('counter', 2);

注意

Laravel 集成支持使用整数和浮点值进行递增和递减。

有关使用缓存的更多信息,请参阅 Laravel 缓存 文档。

要默认使用mongodb存储,请更改config/cache.php中的默认存储。

return [ 'default' => env('CACHE_STORE', 'mongodb'), 'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', ], ],];

注意

在上一个示例中,我们故意省略了所有可选参数,因此应用了默认值。

可以在您的环境或.env文件中设置CACHE_STORE变量。 按如下方式更新或删除:

CACHE_STORE=mongodb

然后,您可以使用Illuminate\Support\Facades\Cache门面和自动注入:

use Illuminate\Support\Facades\Cache; Cache::get('foo', 5);

以下示例展示了如何通过使用默认存储来自动注入缓存管理器。 该示例创建的控制器在每次调用时都会递增计数器。

<?php namespace App\Http\Controllers; use App\Contracts\CacheManager; class CountController extends Controller{ public function __construct( private CacheManager $cache, ) {} public function hit(): int { return $this->cache->increment('counter'); }}

原子锁允许操作分布式锁,而不必担心争用条件。 以下示例实现了原子锁:

use Illuminate\Support\Facades\Cache; $lock = Cache::store('mongodb')->lock('foo', 10); if ($lock->get()) { // Lock acquired for 10 seconds... $lock->release();}

有关使用锁的更多信息,请参阅Laravel 锁文档。

给本页内容打分