Docs 菜单
Docs 主页
/ / /
Laravel MongoDB

缓存和锁

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

'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] 。 修剪过期缓存项的概率为[chance, total] 。 设置为[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 }
)

如果使用锁,请通过将概率设置为 来禁用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 锁文档。

后退

用户身份认证