Usando o StackExchange.Redis para manipular o cache redis, o erro é o seguinte:
StackExchange.Redis.RedisServerException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
Solução temporária, modificar o arquivo redis.windows.conf,O serviço Redis precisa ser reiniciado, define da seguinte forma:
Se você não quiser reiniciar o serviço Redis, pode usar o comando redis-cli para configurá-lo da seguinte forma:
A explicação é a seguinte:
# Por padrão, o Redis deixará de aceitar escritas se os snapshots RDB estiverem ativados # (pelo menos um ponto de salvamento) e o último save em segundo plano falhou. # Isso fará o usuário perceber (de forma difícil) que os dados não estão persistindo # No disco corretamente, caso contrário, é provável que ninguém perceba e alguns # O desastre vai acontecer.
# # Se o processo de salvar em segundo plano começar a funcionar novamente, Redis vai # permitir escritas automaticamente novamente.
# # No entanto, se você configurou seu monitoramento adequado do servidor Redis # e persistência, você pode querer desativar esse recurso para que o Redis # continuar funcionando normalmente mesmo que haja problemas com o disco, # Permissões, e assim por diante. Simplificando: o Redis precisa fazer um fork em um processo principal para evitar que ele finja a morte ao salvar dados no disco rígido, e então completar a operação de salvar dados no disco rígido no processo; se o processo principal usa 4GB de memória, são necessários mais 4GB quando o subprocesso do fork for necessário; nesse momento, a memória não é suficiente, o fork falha, e então o disco rígido de salvamento de dados também falha. Para visualizar os logs do Redis, você precisa configurar o redis.windows.conf da seguinte forma:
# Especifique o nome do arquivo de log. Além disso, 'stdout' pode ser usado para forçar # Redis para registrar a saída padrão. arquivo de registro "E:/Redis-x64-3.2.100/redis.txt" As exceções logarítmicas são as seguintes:
[8984] 14 de maio 14:05:09.060 * Salvamento em segundo plano iniciado por pid 8672 [8672] 14 de maio 14:05:09.169 # A versão para Windows do Redis reserva memória heap do arquivo de paginação do sistema para compartilhamento com o processo bifurcado usado em operações de persistência. No momento, não há espaço livre contíguo suficiente disponível no arquivo de paginação do sistema. Você pode aumentar o tamanho do arquivo de paginação do sistema. Às vezes, um reboot desfragmenta o arquivo de paginação do sistema o suficiente para essa operação foi concluída com sucesso.
Redis não pode continuar. Sair. [8984] 14 de maio 14:05:09.278 # operação de bifurcação falhada
Após análise, descobriu-se que o problema com a configuração do tamanho máximo do heap "maxheap" era devido à memória disponível insuficiente.
Solução
Abra o arquivo de configuração do Reddis "redis.windows.conf" e encontre a seguinte seção de código:
# O heap Redis deve ser maior que o valor especificado pelo maxmemory # flag, já que o alocador de heap tem seus próprios requisitos de memória e # A fragmentação do monte é inevitável. Se apenas a flag maxmemory for # especificado, o maxheap será definido em 1,5*maxmemory. Se a flag de maxheap for # especificado junto com maxmemory, a flag do maxheap será automaticamente # aumentado se for menor que 1,5*maxmemory. # # maxheap <bytes> Adicionar essa configuração é bom,O serviço Redis não começa!!!!!!!
O valor padrão é: maxheap 1024000000≈976,56M
Não encontrei esse comentário no arquivo de conf, achei algo assim:
# Não use mais memória do que a quantidade especificada de bytes. # Quando o limite de memória for atingido, Redis tentará remover chaves # De acordo com a política de despejo selecionada (veja maxmemory-policy).
# # Se Redis não pode remover chaves conforme a política, ou se a política for # definido para 'noeviction', Redis começará a responder com erros nos comandos # que usariam mais memória, como SET, LPUSH, e assim por diante, e continuarão # para responder a comandos somente leitura como GET.
# # Essa opção geralmente é útil ao usar o Redis como cache LRU, ou para definir # Um limite rígido de memória para uma instância (usando a política de 'noeviction').
# # AVISO: Se você tem escravos conectados a uma instância com maxmemory ativado, # O tamanho dos buffers de saída necessários para alimentar os escravos é subtraído # a partir da contagem de memória usada, de modo que problemas de rede / resincronizações # não acionar um loop onde as chaves são removidas, e consequentemente a saída # buffer de escravos está cheio com DELs de chaves despejadas, desencadeando a exclusão # de mais chaves, e assim por diante até que o banco de dados esteja completamente vazio.
# # Em resumo... Se você tiver escravos anexados, sugere-se que você coloque um escravo inferior # limite para maxmemory para que haja alguma RAM livre no sistema para o slave # buffers de saída (mas isso não é necessário se a política for 'noeviction').
# # AVISO: não configurar maxmemory fará com que Redis termine com um # Exceção fora de memória se o limite do heap for atingido.
# # NOTA: como o Redis usa o arquivo de paginação do sistema para alocar a memória do heap, # o uso da memória do Conjunto de Trabalho mostrado pelo Gerenciador de Tarefas do Windows ou por outros # ferramentas como o ProcessExplorer nem sempre serão precisas. Por exemplo, à direita # após um save em segundo plano dos arquivos RDB ou AOF, o valor do conjunto de trabalho # pode cair significativamente. Para verificar a quantidade correta de memória usada # pelo redis-server para armazenar os dados, use o comando cliente INFO. A INFORMAÇÃO O comando # mostra apenas a memória usada para armazenar os dados Redis, não o extra # memória usada pelo processo do Windows para seus próprios requisitos. Th3 quantidade extra # de memória não reportada pelo comando INFO pode ser calculada subtraindo o # Conjunto de Trabalho de Pico reportado pelo Gerenciador de Tarefas do Windows e pelo used_memory_peak # reportado pelo comando INFO.
# # maxmemory <bytes> Aviso: Se o limite do heap for atingido, não definir maxmemory fará com que o Redis termine com uma exceção por falta de memória.
Nota: Devido aO Redis utiliza arquivos de paginação do sistema para alocar memória heap,
O Gerenciador de Tarefas do Windows ou outras ferramentas como o Explorador de Processos nem sempre mostram o uso preciso da memória do conjunto de funcionários. Em termos simples,O uso de memória mostrado pelo Gerenciador de Tarefas não é preciso!!!
Use o comando info para consultar da seguinte forma:
# Memória used_memory:2011338768 used_memory_human:1,87G used_memory_rss:2011279992 used_memory_rss_human:1,87G used_memory_peak:2011338768 used_memory_peak_human:1,87G total_system_memory:0 total_system_memory_human:0B used_memory_lua:37888 used_memory_lua_human:37,00K
maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:1,00 mem_allocator:jemalloc-3.6.0
As configurações são as seguintes:
1073741824 bytes = 1G Após a configuração, o cliente .net redis adiciona um erro de cache da seguinte forma:
Comando OOM não é permitido quando usado memória > 'maxmemory'. # POLÍTICA DE MAXMEMORY: como o Redis vai selecionar o que remover quando maxmemory # é alcançado. Você pode escolher entre cinco comportamentos:
# # volatile-lru -> remover a chave com um conjunto expire usando um algoritmo LRU # allkeys-lru -> remover qualquer chave de acordo com o algoritmo LRU # Volátil-aleatório -> remover uma chave aleatória com um conjunto expire # todas as chaves-aleatórias -> remover uma chave aleatória, qualquer chave # volatile-ttl -> remover a chave com o tempo de expiração mais próximo (TTL menor) # Noeviction - > não expiram, apenas retornam erro nas operações de escrita
# # Nota: com qualquer uma das políticas acima, Redis retornará um erro ao escrever # Operações, quando não há chaves adequadas para despejo.
# # Na data de escrita, esses comandos são: set setnx setex append # Incr Decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd # sinter sinterstore sunion sunionstore sdiff sdiff sdiff sdiff zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec sort
# # O padrão é:
# # política de noeviction da MaxMemory #MAXMEMORY策略: Quando MAXMEMORY
#到达. Você pode escolher entre cinco comportamentos:
#
#volatile LRU-> usa o algoritmo LRU para remover chaves com conjuntos de expiração
#allkeys LRU-> excluir qualquer chave de acordo com o algoritmo LRU
#volatile aleatório - > remover chaves aleatórias com conjuntos expirados
#allkeys > aleatórios excluir chaves aleatórias, chaves arbitrárias
#volatile TTL-> Exclua a chave com o tempo de expiração mais próximo (TTL menor)
#noeviction-> não expira, apenas retorna erros na operação de escrita
#
#注意: Para qualquer uma das estratégias acima, o Redis retorna um erro ao escrever
#操作, quando não há chave adequada para despejo.
#
#在编写之日, esses comandos são: set setnx setex append
#递增递减rpush lpushx lpushx linsert lset rpoplpush sadd
#烧结店sunion sunionstore sdiff sdiff sdiffstore zadd zincrby
#zunionstore Zinterstore Hset Hset, HMSET Hincrby Incrby Decrby
#getset mset msetNX exec sorting
#
#默认值为:
#
#maxmemory策略无效 Você também precisa configurar as seguintes configurações:
A configuração padrão do redis é muito conservadora, ou seja, ela não é armazenada após o limite de memória ser ultrapassado, e a política pode ser alterada para o algoritmo LRU (o algoritmo menos usado recentemente) – as informações recém-armazenadas substituirão as antigas.
Revisar:
(Fim)
|