Met StackExchange.Redis om de redis-cache te manipuleren, is de fout als volgt:
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.
Tijdelijke oplossing, het bestand redis.windows.conf wijzigen,De dienst van Redis moet opnieuw worden opgestart, als volgt ingesteld:
Als je de Redis-dienst niet wilt herstarten, kun je het redis-cli-commando gebruiken om het als volgt in te stellen:
De uitleg is als volgt:
# Standaard accepteert Redis geen schrijfacties meer als RDB-snapshots zijn ingeschakeld # (minstens één savepunt) en de laatste achtergrondsave mislukte. # Dit maakt de gebruiker zich (op een harde manier) bewust dat data niet blijft bestaan # op schijf op de juiste manier, anders is de kans groot dat niemand het merkt en nog wat # Rampen zullen gebeuren.
# # Als het achtergrondopslaan weer begint te werken, zal Redis het doen # Automatisch opnieuw schrijven toestaan.
# # Maar als je de Redis-server goed hebt bewaken # en persistentie, wil je deze functie misschien uitschakelen zodat Redis dat kan doen # Blijf werken zoals gewoonlijk, ook al zijn er problemen met de schijf, # Toestemmingen, enzovoort. Simpel gezegd: Redis moet een hoofdproces forken om te voorkomen dat het hoofdproces doet alsof het overlijden is bij het opslaan van data op de harde schijf, en vervolgens de operatie voltooien om data op de harde schijf op te slaan in het forkproces; als het hoofdproces 4GB geheugen gebruikt, is er nog eens 4GB nodig wanneer het fork-subproces nodig is; op dat moment is het geheugen niet genoeg, faalt de fork, en vervolgens faalt ook de data-opslaande harde schijf. Om de redis-logs te bekijken, moet je redis.windows.conf als volgt configureren:
# Specificeer de naam van het logbestand. Ook kan 'stdout' worden gebruikt om te forceren # Redis om in te loggen op de standaarduitvoer. logbestand "E:/Redis-x64-3.2.100/redis.txt" De log-uitzonderingen zijn als volgt:
[8984] 14 mei 14:05:09.060 * Achtergrondopslaan gestart door pid 8672 [8672] 14 mei 14:05:09.169 # De Windows-versie van Redis reserveert heapgeheugen uit het systeempagingbestand voor delen met het gevorkte proces dat wordt gebruikt voor persistentiebewerkingen. Op dit moment is er onvoldoende aaneengesloten vrije ruimte beschikbaar in de systeempagina-bestand. Je kunt de grootte van het systeem-pagingbestand vergroten. Soms zal een herstart het systeempagingbestand voldoende defragmenteren voor Deze operatie succesvol voltooid.
Redis kan niet doorgaan. Vertrek. [8984] 14 mei 14:05:09.278 # vorkoperatie mislukt
Na analyse bleek dat het probleem met de maximale heapgrootte "maxheap" configuratie te wijten was aan onvoldoende beschikbaar geheugen.
Oplossing
Open het configuratiebestand van Redis "redis.windows.conf" en vind de volgende codesectie:
# De Redis-heap moet groter zijn dan de waarde die door de maxmemory is gespecificeerd # vlag, aangezien de heap allocator zijn eigen geheugenvereisten heeft en # Fragmentatie van de hoop is onvermijdelijk. Als alleen de maxmemory-vlag is # gespecificeerd, maxheap wordt ingesteld op 1,5*maxmemory. Als de maxheap-vlag is # gespecificeerd samen met maxmemory, wordt de maxheap-vlag automatisch gespecificeerd # verhoogd als het kleiner is dan 1,5*maxgeheugen. # # maxheap <bytes> Het toevoegen van deze instelling is goed,De dienst van Redis start niet!!!!!!!
De standaardwaarde is: maxheap 10240000000≈976,56M
Ik vond deze opmerking niet in het conf-bestand, ik vond iets als dit:
# Gebruik niet meer geheugen dan het aangegeven aantal bytes. # Wanneer de geheugenlimiet is bereikt, zal Redis proberen sleutels te verwijderen # volgens het gekozen uitzettingsbeleid (zie maxmemory-policy).
# # Als Redis volgens het beleid geen sleutels kan verwijderen, of als het beleid wel # ingesteld op 'noeviction', zal Redis beginnen te antwoorden met fouten op commando's # die meer geheugen zou gebruiken, zoals SET, LPUSH, enzovoort, en zal doorgaan # om te reageren op alleen-lezen commando's zoals GET.
# # Deze optie is meestal handig bij het gebruik van Redis als LRU-cache, of om in te stellen # een harde geheugenlimiet voor een instantie (gebruikmakend van het 'noeviction'-beleid).
# # WAARSCHUWING: Als je slaves aan een instantie hebt gekoppeld met maxmemory aan, # de grootte van de outputbuffers die nodig zijn om de slaven te voeden wordt afgetrokken # uit het aantal gebruikte geheugens, zodat netwerkproblemen / hersynchronisaties dat wel zullen doen # niet een lus triggeren waarin toetsen worden uitgezet, en op zijn beurt de output # buffer van slaven is vol met DEL's van uitgezette sleutels die de verwijdering triggeren # van meer sleutels, enzovoort totdat de database volledig leeg is.
# # Kortom... Als je slaven hebt verbonden, wordt aangeraden om een lager in te stellen # limiet voor maxmemory zodat er wat vrij RAM op het systeem is voor slave # outputbuffers (maar dit is niet nodig als het beleid 'noeviction' is).
# # WAARSCHUWING: het niet instellen van maxmemory zorgt ervoor dat Redis eindigt met een # Out-of-memory uitzondering als de heaplimiet is bereikt.
# # OPMERKING: aangezien Redis het systeempagingbestand gebruikt om het heapgeheugen toe te wijzen, # Het geheugengebruik van de werkset wordt weergegeven door de Windows Taakbeheer of door andere # Tools zoals ProcessExplorer zijn niet altijd accuraat. Bijvoorbeeld, rechts # na een achtergrondsave van de RDB- of AOF-bestanden, de waarde van de werkset, # kan aanzienlijk dalen. Om de juiste hoeveelheid gebruikte geheugen te controleren # door de redis-server om de data op te slaan, gebruik het INFO-clientcommando. De INFO # opdracht toont alleen het geheugen dat gebruikt is om de redis-data op te slaan, niet het extra # geheugen dat door het Windows-proces wordt gebruikt voor zijn eigen behoeften. Th3 extra hoeveelheid # van geheugen dat niet door het INFO-commando wordt gerapporteerd, kan worden berekend door de # Peak Working Set gerapporteerd door de Windows Taakbeheer en de used_memory_peak # gerapporteerd door het INFO-commando.
# # maxmemory <bytes> Waarschuwing: Als de heaplimiet wordt bereikt, zal het niet instellen van maxmemory ervoor zorgen dat Redis eindigt met een out-of-memory uitzondering.
Opmerking: VanwegeRedis gebruikt systeempagingbestanden om heapgeheugen toe te wijzen,
Windows Taakbeheer of andere tools zoals ProcessExplorer tonen niet altijd nauwkeurig gebruik van het werksetgeheugen. In eenvoudige termen,Het geheugengebruik dat door Taakbeheer wordt weergegeven, is niet accuraat!!!
Gebruik het info-commando om als volgt te zoeken:
# Herinnering 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: geen uitzetting mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
De instellingen zijn als volgt:
1073741824 bytes = 1G Na de instelling voegt de redis .net-client een cachefout toe als volgt:
OOM-commando niet toegestaan bij geheugengebruik > 'maxmemory'. # MAXMEMORY BELEID: hoe Redis selecteert wat hij verwijdert wanneer maxmemory # is bereikt. Je kunt kiezen uit vijf gedragingen:
# # vluchtig-lru -> verwijder de sleutel met een expire set met een LRU-algoritme # allkeys-lru -> verwijder elke sleutel volgens het LRU-algoritme # vluchtig-willekeurig -> verwijder een willekeurige sleutel met een vervalset set # allkeys-random -> verwijder een willekeurige sleutel, elke sleutel # vluchtig-ttl -> verwijder de sleutel met de dichtstbijzijnde vervaldatum (kleine TTL) # noeviction -> verlopen helemaal niet, geven alleen een foutmelding bij schrijfoperaties
# # Opmerking: met een van bovenstaande beleidsregels geeft Redis een foutmelding bij schrijven # Operaties, wanneer er geen geschikte sleutels voor uitzetting zijn.
# # Op de schrijfdatum zijn deze commando's: set setnx setex append # incr decr rpush lpush rpushx lpushx lpushx linsert lset rpoplpush sadd # Sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec sort
# # De standaard is:
# # maxmemory-beleid noevictie #MAXMEMORY策略: Wanneer MAXMEMORY
#到达. Je kunt kiezen uit vijf gedragingen:
#
#volatile gebruikt LRU-> het LRU-algoritme om sleutels met verloopsets te verwijderen
#allkeys LRU-> elke sleutel verwijderen volgens het LRU-algoritme
#volatile willekeurig - > verwijder willekeurige sleutels met verlopen sets
#allkeys willekeurige > willekeurige sleutels verwijderen, willekeurige sleutels
#volatile TTL-> Verwijder de sleutel met de dichtstbijzijnde vervaldatum (Minor TTL)
#noeviction-> verloopt helemaal niet, maar geeft alleen schrijffouten terug
#
#注意: Voor elk van bovenstaande strategieën geeft Redis een foutmelding bij schrijven
#操作, wanneer er geen geschikte sleutel voor uitzetting is.
#
#在编写之日 zijn deze commando's: set setnx setex append
#递增递减rpush lpushx lpushx linsert lset rpoplpush sadd
#烧结店sunion sunionstore sdiff sdiffstore zadd zincrby
#zunionstore Zinterstore Hset Hsetnx HMSET Hincrby Incrby Decrby
#getset MSet MSETNX uitvoerende sortering
#
#默认值为:
#
#maxmemory策略无效 Je moet ook de volgende configuraties instellen:
De standaard redis-instelling is zeer conservatief, dat wil zeggen, deze wordt niet opgeslagen nadat de geheugenlimiet is overschreden, en het beleid kan worden gewijzigd naar het LRU-algoritme (het minst gebruikte algoritme recentelijk) - de nieuw opgeslagen informatie vervangt de oude informatie.
Recensie:
(Einde)
|