文档菜单
文档首页
/ / /
Laravel MongoDB

缓存和锁

要将MongoDB用作后端,用于Laravel缓存和锁,通过指定mongodb驱动程序,在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数据库连接,请参阅连接部分。

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

设置
描述
driver
必需。指定要使用的锁驱动程序。必须是mongodb
connection
必需。用于存储缓存项的数据库连接。它必须是一个mongodb连接。
collection
默认cache。存储缓存项的MongoDB集合名称。
lock_connection
默认为缓存connection。用于存储锁的数据库连接。它必须是一个mongodb连接。
lock_collection
默认cache_locks。存储锁的MongoDB集合名称。
lock_lottery
默认[2, 100]。剪枝过期缓存项的概率[机会,总数]。设置为[0, 0]以禁用。
lock_timeout
默认值为 86400。锁的超时时间,以秒为单位。

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 }
)

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

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

可以使用 Laravel 缓存存储任何可序列化的数据,使用 facade 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 Cache 文档。

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

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

注意

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

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

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 Locks文档。

返回

用户认证