キャッシュとロック
構成
MongoDBを Lambda Cache および locks のバックエンドとして使用するには、 で ドライバーを指定してストア構成を追加します。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 } )
ロックを使用する場合は、確率を0
に設定してlock_lottery
を無効にします。
'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', 'lock_lottery' => [0, 100], // Disabled ], ],
MongoDB キャッシュの使用
Lambda キャッシュは、ファサード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);
注意
Lambda 統合は、整数値と浮動小数点数によるインクリメントとデクリメントをサポートします。
キャッシュの使用の詳細については、 Lambda キャッシュのドキュメント を参照してください。
デフォルト キャッシュとしての 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(); }
ロックの使用の詳細については、 Lambda ロック のドキュメントを参照してください。