Cache e travas
Configuração
Para usar o MongoDB como backend para o Laravel Cache and Locks, adicione uma configuração de armazenamento especificando o mongodb
driver config/cache.php
em:
'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', 'collection' => 'cache', 'lock_connection' => 'mongodb', 'lock_collection' => 'cache_locks', 'lock_lottery' => [2, 100], 'lock_timeout' => 86400, ], ],
Para configurar a conexão do banco de dados de dados do mongodb
, consulte a seçãoConexões do .
A tabela a seguir descreve uma lista de opções de cache e bloqueio e seus valores padrão:
Contexto | Descrição |
---|---|
driver | Obrigatório. Especifica o driver de bloqueio a ser usado. Deve ser mongodb . |
connection | Obrigatório. A conexão do banco de dados utilizada para armazenar itens de cache. Deve ser uma conexão mongodb . |
collection | Padrão cache . Nome da coleção MongoDB para armazenar itens de cache. |
lock_connection | Padrão para o cache connection . A conexão do banco de dados usada para armazenar travas. Deve ser uma conexão mongodb . |
lock_collection | Padrão cache_locks . Nome da collection MongoDB para armazenar travas. |
lock_lottery | Padrão [2, 100] . Probabilidade [chance, total] de podar itens de cache expirados. Defina como [0, 0] para desativar. |
lock_timeout | Padrão 86400 . Tempo de vida útil das travas, em segundos. |
Configurar índices de expiração automática
Os índices TTL integrados ao MongoDB excluem automaticamente documentos quando eles expiram. Seu uso é opcional com o driver mongodb
, mas recomendado. Os índices fornecem melhor desempenho delegando a exclusão de documentos expirados ao MongoDB em vez de exigir que o aplicativo execute essa tarefa.
Crie os índices com uma migração que chama os métodos createTTLIndex()
fornecidos pelo cache e pelos armazenamentos de travas:
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(); } };
Em seguida, execute a migração:
php artisan migrate
Alternativamente, você pode criar o índice usando MongoDB Shell (mongosh
):
db.cache.createIndex( /* Field that holds the expiration date */ { expires_at: 1 }, /* Delay to remove items after expiration */ { expireAfterSeconds: 0 } )
Se você usar Travas, desative lock_lottery
definindo a probabilidade como 0
:
'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', 'lock_lottery' => [0, 100], // Disabled ], ],
Usando cache MongoDB
O cache do Laravel pode ser usado para armazenar quaisquer dados serializáveis usando a face Illuminate\Support\Facades\Cache
.
Este exemplo executa as seguintes ações:
Obtém o repositório de cache com o armazenamento
mongodb
Tenta ler e retornar o item de cache chamado
foo
Se estiver ausente, chama o fechamento para calcular o valor, armazena o valor para sempre e o retorna
use Illuminate\Support\Facades\Cache; $value = Cache::store('mongodb')->get('foo', function () { return [1, 2, 3]; });
Por padrão, os objetos armazenados em cache não expiram. No entanto, é possível definir um tempo de expiração, como mostrado no exemplo a seguir:
Cache::store('mongodb')->set('foo', 'abc', '1 day');
O incremento e o decremento de um valor também são suportados se o valor for inicializado antes. O exemplo a seguir inicializa o contador para 3
, adiciona 5 e remove 2.
Cache::store('mongodb')->set('counter', 3); Cache::store('mongodb')->increment('counter', 5); Cache::store('mongodb')->decrement('counter', 2);
Observação
A integração do Laravel suporta incrementar e decrementar com valores inteiros e flutuantes.
Para mais informações sobre como utilizar o cache, consulte a documentação do Laravel Cache.
Configurando MongoDB como cache padrão
Para usar o armazenamento mongodb
por padrão, altere o armazenamento padrão em config/cache.php
.
return [ 'default' => env('CACHE_STORE', 'mongodb'), 'stores' => [ 'mongodb' => [ 'driver' => 'mongodb', 'connection' => 'mongodb', ], ], ];
Observação
Omitimos deliberadamente todos os parâmetros opcionais no exemplo anterior, para que os valores padrão sejam aplicados.
A variável CACHE_STORE
pode ser configurada em seu ambiente ou no arquivo .env
. Atualize ou remova-o da seguinte maneira:
CACHE_STORE=mongodb
Em seguida, você pode usar a Illuminate\Support\Facades\Cache
e a injeção automática:
use Illuminate\Support\Facades\Cache; Cache::get('foo', 5);
O exemplo a seguir mostra como usar a injeção automática do gerenciador de cache usando o armazenamento padrão. O exemplo cria um controlador que incrementa um contador cada vez que é invocado.
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'); } }
Usando o bloqueio do MongoDB
As travas atômicas permitem a manipulação de travas distribuídas sem se preocupar com condições de corrida. O exemplo a seguir implementa uma trava atômica:
use Illuminate\Support\Facades\Cache; $lock = Cache::store('mongodb')->lock('foo', 10); if ($lock->get()) { // Lock acquired for 10 seconds... $lock->release(); }
Para obter mais informações sobre o uso de travas, consulte a documentação de travas do Laravel.