缓存和锁
配置
要将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()
方法创建索引
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 ], ],
使用 MongoDB 缓存
可以使用 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 作为默认缓存
要默认使用 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);
以下示例展示了如何通过使用默认存储库来自动注入缓存管理器。示例创建了一个控制器,每次调用都会增加计数器。
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 Locks文档。