Utilizzando StackExchange.Redis per manipolare la cache redis, l'errore è il seguente:
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.
Soluzione temporanea, modificare il file redis.windows.conf,Il servizio Redis deve essere riavviato, imposta come segue:
Se non vuoi riavviare il servizio Redis, puoi usare il comando redis-cli per configurarlo come segue:
La spiegazione è la seguente:
# Per impostazione predefinita, Redis smetterà di accettare scritture se gli snapshot RDB sono abilitati # (almeno un punto di salvataggio) e l'ultimo salvataggio in background è fallito. # Questo renderà l'utente consapevole (in modo difficile) che i dati non persistono # Su disco correttamente, altrimenti è probabile che nessuno se ne accorga e alcuni # Il disastro accaderà.
# # Se il processo di salvataggio in background ricomincierà a funzionare Redis # Consentire automaticamente le scritture di nuovo.
# # Tuttavia, se hai impostato il monitoraggio corretto del server Redis # e persistenza, potresti voler disabilitare questa funzione in modo che Redis # continuare a lavorare normalmente anche se ci sono problemi con il disco, # permessi, e così via. In poche parole: Redis deve fare un fork su un processo principale per evitare che il processo principale finga la morte durante il salvataggio dei dati sull'hard disk, e poi completare l'operazione di salvataggio dei dati sull'hard disk nel processo fork; se il processo principale utilizza 4GB di memoria, sono necessari altri 4GB quando è necessario il sotto-processo del fork; in questo momento la memoria non è sufficiente, il fork fallisce e poi anche il disco rigido di salvataggio dei dati fallisce. Per visualizzare i log redis, devi configurare redis.windows.conf come segue:
# Specifica il nome del file di log. Inoltre, 'stdout' può essere usato per forzare # Redis per accedere all'uscita standard. file di registro "E:/Redis-x64-3.2.100/redis.txt" Le eccezioni logarime sono le seguenti:
[8984] 14 maggio 14:05:09.060 * Salvataggio in background avviato dal pid 8672 [8672] 14 maggio 14:05:09.169 # La versione Windows di Redis riserva memoria heap dal file di paging di sistema per la condivisione con il processo forkato utilizzato per le operazioni di persistenza. Al momento non c'è spazio libero contiguo sufficiente nel file di paging di sistema. Puoi aumentare la dimensione del file di paging di sistema. A volte un riavvio deframmenta il file di paginazione di sistema in modo sufficiente per questa operazione fu completata con successo.
Redis non può continuare. Uscire. [8984] 14 maggio 14:05:09.278 # operazione fork fallita
Dopo l'analisi, si scoprì che il problema con la configurazione "maxheap" di dimensione massima dell'heap era dovuto a una memoria disponibile insufficiente.
Soluzione
Apri il file di configurazione di Reddis "redis.windows.conf" e trova la seguente sezione del codice:
# L'heap di Redis deve essere maggiore del valore specificato dalla maxmemory # flag, poiché l'allocator dell'heap ha i propri requisiti di memoria e # La frammentazione del mucchio è inevitabile. Se solo il flag maxmemory è # Specificato, il maxheap sarà impostato a 1.5*MaxMemory. Se il flag del maxheap è # specificato insieme a maxmemory, il flag maxheap sarà automaticamente # aumentato se è inferiore a 1,5*maxmemory. # # Maxheap <bytes> Aggiungere questa impostazione è positivo,Il servizio Redis non si avvia!!!!!!!
Il valore predefinito è: maxheap 1024000000≈976,56M
Non ho trovato questo commento nel file di conferenza, ho trovato qualcosa del genere:
# Non usare più memoria del numero specificato di byte. # Quando il limite di memoria sarà raggiunto, Redis cercherà di rimuovere le chiavi # Secondo la politica di sfrattamento selezionata (vedi maxmemory-policy).
# # Se Redis non può rimuovere le chiavi secondo la politica, o se la politica è # impostato su 'noeviction', Redis inizierà a rispondere con errori ai comandi # che consumerebbe più memoria, come SET, LPUSH e così via, e continuerà # per rispondere a comandi di sola lettura come GET.
# # Questa opzione è solitamente utile quando si usa Redis come cache LRU, o per impostare # Un limite di memoria rigido per un'istanza (usando la politica di 'noeviction').
# # ATTENZIONE: Se hai schiavi collegati a un'istanza con maxmemory attivata, # Si sottrae la dimensione dei buffer di uscita necessari per alimentare gli schiavi # dal conteggio della memoria usata, così che i problemi di rete / le risincronizzazioni # non attivare un loop in cui le chiavi vengono sfrattate, e di conseguenza l'output # buffer degli schiavi è pieno con i DAL delle chiavi sfrattate che attivano la cancellazione # di più chiavi, e così via finché il database non sarà completamente vuoto.
# # In breve... Se hai schiavi attaccati, si consiglia di impostare un livello più basso # limite per maxmemory in modo che ci sia un po' di RAM libera nel sistema per slave # buffer di uscita (ma questo non è necessario se la politica è 'noevition').
# # ATTENZIONE: non impostare maxmemory farà terminare Redis con un # eccezione fuori memoria se il limite dell'heap è raggiunto.
# # NOTA: poiché Redis utilizza il file di paging di sistema per allocare la memoria heap, # l'uso della memoria del Working Set mostrato dal Task Manager di Windows o da altri # strumenti come ProcessExplorer non saranno sempre precisi. Per esempio, giusto # dopo un salvataggio in background dei file RDB o AOF, il valore del set di lavoro # potrebbe scendere significativamente. Per verificare la quantità corretta di memoria utilizzata # dal redis-server per memorizzare i dati, usa il comando client INFO. Le INFORMAZIONI # Command mostra solo la memoria utilizzata per memorizzare i dati Redis, non l'extra # memoria utilizzata dal processo Windows per le proprie esigenze. Th3 quantità extra # di memoria non riportata dal comando INFO può essere calcolata sottraendo il # Set di lavoro di picco riportato dal Task Manager di Windows e dal used_memory_peak # segnalato dal comando INFO.
# # maxmemory <bytes> Attenzione: Se il limite dell'heap viene raggiunto, non impostare maxmemory causerà la terminazione di Redis con un'eccezione per esaurimento di memoria.
Nota: A causa diRedis utilizza file di paging di sistema per allocare la memoria heap,
Il Task Manager di Windows o altri strumenti come ProcessExplorer non mostrano sempre un uso accurato della memoria del worket. In termini semplici,L'utilizzo della memoria mostrato da Task Manager non è accurato!!!
Usa il comando info per interrogare come segue:
# Memoria 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:noefratto mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
Le impostazioni sono le seguenti:
1073741824 byte = 1G Dopo l'impostazione, il client .net redis aggiunge un errore di cache come segue:
Il comando OOM non è consentito quando la memoria > 'maxmemory'. # POLITICA MAXMEMORY: come Redis selezionerà cosa rimuovere quando maxmemory # è raggiunto. Puoi scegliere tra cinque comportamenti:
# # volatile-lru -> rimuovere la chiave con un set di scadenza usando un algoritmo LRU # allkeys-lru -> rimuovere qualsiasi chiave secondo l'algoritmo LRU # volatile-random -> rimuovere una chiave casuale con un set di scadenza # tutte le chiavi casuali -> rimuovere una chiave casuale, qualsiasi chiave # volatile-ttl -> rimuovere la chiave con il tempo di scadenza più vicino (minor TTL) # noeviction - > non scadono affatto, restituiscono solo un errore durante le operazioni di scrittura
# # Nota: con una delle politiche sopra elencate, Redis restituirà un errore alla scrittura # Operazioni, quando non ci sono chiavi adatte per lo sfratto.
# # Alla data di stesura questi comandi sono: set setnx setex append # incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd # Sinter Sinterstore Sunion Unionstore Sdiff Sdiffstore Zadd ZincRby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx ordinamento esecutivo
# # Il predefinito è:
# # Sfratto della politica MaxMemory #MAXMEMORY策略: Quando MAXMEMORY
#到达. Puoi scegliere tra cinque comportamenti:
#
#volatile LRU-> utilizza l'algoritmo LRU per rimuovere le chiavi con insiemi di scadenza
#allkeys LRU-> eliminare qualsiasi chiave secondo l'algoritmo LRU
#volatile casuale - > rimuovere chiavi casuali con set scaduti
#allkeys > casuali eliminano chiavi casuali, chiavi arbitrarie
#volatile TTL-> Elimina la chiave con il tempo di scadenza più vicino (TTL minore)
#noeviction-> non scade affatto, restituisce solo errori di scrittura
#
#注意: Per una qualsiasi delle strategie sopra, Redis restituisce un errore alla scrittura
#操作, quando non c'è una chiave adatta per lo sfratto.
#
#在编写之日, questi comandi sono: 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 mset: ordinamento executiv
#
#默认值为:
#
#maxmemory策略无效 Devi anche impostare le seguenti configurazioni:
L'impostazione redis predefinita è molto conservativa, cioè non viene memorizzata dopo che il limite di memoria è stato superato, e la policy può essere modificata con l'algoritmo LRU (l'algoritmo meno usato recentemente) - le nuove informazioni memorizzate sostituiranno quelle vecchie.
Recensione:
(Fine)
|