Configuración
Para utilizar MongoDB como back-end para Caché y bloqueos de Laravel, agrega una configuración de almacenar especificando la mongodb driver en 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, ], ],
Para configurar la conexión de base de datos mongodb, consulta la Sección Guía de conexión.
La siguiente tabla describe una lista de opciones de caché y bloqueo y sus valores por defecto:
Configuración | Descripción |
|---|---|
| Obligatorio. Especifica el driver de bloqueo que se debe usar. Debe ser |
| Obligatorio. La conexión de base de datos utilizada para almacenar elementos de caché. Debe ser una conexión |
| Por defecto |
| Por defecto, al caché |
| Por defecto |
| Valor predeterminado: |
| Por defecto |
Configurar índices de vencimiento automático
Los índices TTL integrados en MongoDB eliminan automáticamente los documentos cuando caducan. Su uso es opcional con el controlador mongodb, pero recomendable. Los índices proporcionan un mejor rendimiento al delegar la eliminación de documentos caducados a MongoDB en lugar de requerir que la aplicación realice esta tarea.
Cree los índices con una migración que llame a los métodos createTTLIndex() proporcionados tanto por la caché como por los almacenes de bloqueos:
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(); } };
Luego ejecuta la migración:
php artisan migrate
Como alternativa, puede crear el índice utilizando MongoDB Shell (mongosh):
db.cache.createIndex( /* Field that holds the expiration date */ { expires_at: 1 }, /* Delay to remove items after expiration */ { expireAfterSeconds: 0 } )
Si utilizas bloqueos, desactiva lock_lottery configurando la probabilidad en 0:
'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', 'lock_lottery' => [0, 100], // Disabled ], ],
Uso de caché MongoDB
La caché de Laravel se puede utilizar para almacenar cualquier dato serializable utilizando la fachada Illuminate\Support\Facades\Cache.
Este ejemplo realiza las siguientes acciones:
Obtiene el repositorio de caché con el almacén
mongodbSe intenta leer y devolver el elemento de caché llamado
fooSi falta, llama al cierre para calcular el valor, almacena el valor para siempre y lo devuelve.
use Illuminate\Support\Facades\Cache; $value = Cache::store('mongodb')->get('foo', function () { return [1, 2, 3]; });
De forma predeterminada, los objetos almacenados en caché no caducan. Sin embargo, es posible definir una fecha de caducidad, como se muestra en el siguiente ejemplo:
Cache::store('mongodb')->set('foo', 'abc', '1 day');
También se admite incrementar y disminuir valores si estos se inicializan previamente. El siguiente ejemplo inicializa el contador a 3, suma 5 y remueve 2.
Cache::store('mongodb')->set('counter', 3); Cache::store('mongodb')->increment('counter', 5); Cache::store('mongodb')->decrement('counter', 2);
Nota
La integración de Laravel admite incrementar y disminuir con valores enteros y float.
Para obtener más información sobre cómo usar la caché, consulta la documentación de Laravel Cache.
Configurar MongoDB como caché por defecto
Para utilizar la tienda mongodb de forma predeterminada, cambie la tienda predeterminada en config/cache.php.
return [ 'default' => env('CACHE_STORE', 'mongodb'), 'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', ], ], ];
Nota
Deliberadamente hemos omitido todos los parámetros opcionales en el ejemplo anterior, por lo que se aplican los valores por defecto.
La variable CACHE_STORE puede establecerse en tu entorno o en el archivo .env. Actualízalo o remuévelo de la siguiente manera:
CACHE_STORE=mongodb
Luego puede usar la fachada Illuminate\Support\Facades\Cache y la inyección automática:
use Illuminate\Support\Facades\Cache; Cache::get('foo', 5);
El siguiente ejemplo muestra cómo utilizar la inyección automática del gestor de caché usando el almacén por defecto. El ejemplo crea un controlador que incrementa un contador cada vez que se invoca.
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'); } }
Uso de MongoDB bloqueo
Los bloqueos atómicos permiten manipular bloqueos distribuidos sin preocuparse por las condiciones de carrera. El siguiente ejemplo implementa un bloqueo atómico:
use Illuminate\Support\Facades\Cache; $lock = Cache::store('mongodb')->lock('foo', 10); if ($lock->get()) { // Lock acquired for 10 seconds... $lock->release(); }
Para obtener más información sobre el uso de bloqueos, consulte la documentación de bloqueos de Laravel.