缓存和锁
配置
要将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()
方法的迁移来创建索引:
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 锁文档。