配置
要将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部分。
下表描述了缓存和锁选项及其默认值的列表:
设置 | 说明 |
|---|---|
| 必需。 指定要使用的锁驱动程序。 必须是 |
| 必需。 用于存储缓存项的数据库连接。 它必须是 |
| 默认 |
| 默认为缓存 |
| 默认 |
| 默认 |
| 默认 |
配置可序列化类
从 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()方法的迁移来创建索引:
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 ],],使用 MongoDB 缓存
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 配置为默认缓存
要默认使用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);以下示例展示了如何通过使用默认存储来自动注入缓存管理器。 该示例创建的控制器在每次调用时都会递增计数器。
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'); }}使用 MongoDB 锁
原子锁允许操作分布式锁,而不必担心争用条件。 以下示例实现了原子锁:
use Illuminate\Support\Facades\Cache;
$lock = Cache::store('mongodb')->lock('foo', 10);
if ($lock->get()) { // Lock acquired for 10 seconds...
$lock->release();}有关使用锁的更多信息,请参阅Laravel 锁文档。