O Redis armazena dados na memória. A memória é limitada e alguns cenários de negócios precisam definir dados para expirar, portanto, há uma estratégia de exclusão de expiração e uma estratégia de eliminação de memória.
Estratégia de exclusão de expiração do Redis
- Exclusão programada
- exclusão preguiçosa
- excluir regularmente
Processo específico | facilidade de memória | compatibilidade com CPU | Há um problema | |
---|---|---|---|---|
Exclusão programada | Crie um cronômetro ao definir a chave para expirar, verifique regularmente se ela expira e exclua-a se expirar | amigável | hostil | Alta pressão na CPU, afetando as operações do usuário |
exclusão preguiçosa | Somente quando a chave é obtida todas as vezes, é julgado se expirou e, se expirou, é excluído | hostil | amigável | Se algumas teclas não forem usadas sempre ocuparão memória |
excluir regularmente | Julgue regular e aleatoriamente o tempo de expiração de uma certa proporção de chaves e exclua-as se expirarem | no centro | no centro | Como julga e exclui aleatoriamente uma certa proporção de chaves, é amigável à memória e à CPU. No entanto, devido à possibilidade de aleatoriedade, em casos extremos, algumas chaves não serão excluídas devido à expiração e não serão verificadas. Em resposta a essa situação, a estratégia para lidar com isso é usar a exclusão preguiçosa + a exclusão regular ao mesmo tempo. |
A principal diferença entre tempo e periodicidade mencionada aqui é: o tempo irá verificar todas as chaves e excluí-las se elas expirarem; enquanto a periodicidade não fará a varredura de todas as chaves, mas apenas excluirá algumas delas.
Através da comparação dessas três estratégias de exclusão, a combinação de exclusão preguiçosa + exclusão regular pode evitar a ocupação inválida da memória até certo ponto, mas é impossível evitá-la completamente. Suponha que: se alguma chave não foi escaneada ou usada, ela escapará da exclusão regular e preguiçosa para que a memória não seja liberada. Dessa forma, precisamos definir uma estratégia de eliminação.
Quando o uso da memória redis atingir o máximo de memória que definimos, a memória será limpa de acordo com a estratégia de eliminação. A estratégia de eliminação tem os oito tipos a seguir:
- noeviction Quando a memória não for suficiente para armazenar os dados gravados, a nova operação de gravação relatará um erro.
- allkeys-lru remove a chave usada menos recentemente quando não há memória suficiente para armazenar os dados gravados.
- allkeys-random Quando a memória não for suficiente para armazenar os dados gravados, remova uma chave aleatoriamente.
- volátil-lru Quando a memória não for suficiente para armazenar os dados gravados, remova a chave usada menos recentemente com o tempo de expiração definido.
- volátil-aleatório Quando a memória não for suficiente para armazenar os dados gravados, remova aleatoriamente a chave com o tempo de expiração definido.
- volátil-ttl Quando a memória não for suficiente para armazenar os dados gravados, a chave com o tempo de expiração anterior será removida primeiro.
- allkeys-lfu (Redis 4.0 e superior), para todas as chaves, exclua primeiro a chave menos usada;
- volátil-lfu (Redis 4.0 e superior), para chaves com tempo de expiração, exclua primeiro a chave menos usada.
Há dois pontos a explicar:
- Geralmente não é recomendado usar estratégias de eliminação relacionadas ao acaso, e alguns dados estão inexplicavelmente ausentes, causando confusão. Mas não há absoluto, precisa ser combinado com cenários de negócios.
- Se nenhum tempo de expiração for definido, o comportamento de volátil-lru/volátil-aleatório/volátil-ttl será semelhante a noeviction.