配置
要将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数据库连接,请参阅连接指南部分。
下表描述了缓存和锁选项及其默认值的列表:
设置 | 说明 |
|---|---|
| 必需。 指定要使用的锁驱动程序。 必须是 |
| 必需。 用于存储缓存项的数据库连接。 它必须是 |
| 默认 |
| 默认为缓存 |
| 默认 |
| 默认 |
| 默认 |
设置自动过期索引
The TTL indexes integrated into MongoDB automatically delete documents when they expire. Their use is optional with the mongodb driver, but recommended. The indexes provide better performance by delegating the deletion of expired documents to MongoDB instead of requiring the application to perform this task.
通过调用缓存和锁存储提供的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
Alternatively, you can create the index by using 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 锁文档。