Ved å bruke StackExchange.Redis for å manipulere redis-cachen, er feilen som følger:
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.
Midlertidig løsning, endre filen redis.windows.conf,Redis-tjenesten må gjenopptas, satt som følger:
Hvis du ikke vil starte Redis-tjenesten på nytt, kan du bruke redis-cli-kommandoen for å sette den opp slik:
Forklaringen er som følger:
# Som standard vil Redis slutte å akseptere skrivinger hvis RDB-snapshots er aktivert # (minst ett lagringspunkt) og den siste bakgrunnslagringen feilet. # Dette vil gjøre brukeren oppmerksom (på en hard måte) på at data ikke lagres # på disk riktig, ellers er sjansen stor for at ingen legger merke til det og litt til # katastrofe vil skje.
# # Hvis bakgrunnslagringen begynner å fungere igjen, vil Redis gjøre det # tillater automatisk skriving igjen.
# # Men hvis du har satt opp riktig overvåking av Redis-serveren # og persistens, kan det være lurt å deaktivere denne funksjonen slik at Redis gjør det # fortsetter å jobbe som vanlig selv om det er problemer med disken, # tillatelser, og så videre. Enkelt sagt: Redis må forke en hovedprosess for å unngå at hovedprosessen later som den dør når data lagres på harddisken, og deretter fullføre operasjonen med å lagre data på harddisken i fork-prosessen. Hvis hovedprosessen bruker 4 GB minne, trengs ytterligere 4 GB når fork-underprosessen trengs, på dette tidspunktet er minnet ikke nok, forken feiler, og deretter feiler også datalagringsharddisken. For å se redis-loggene må du konfigurere redis.windows.conf som følger:
# Spesifiser navnet på loggfilen. Også 'stdout' kan brukes til å tvinge # Redis for å logge på standardutgangen. loggfil "E:/Redis-x64-3.2.100/redis.txt" Log-unntakene er som følger:
[8984] 14. mai 14:05:09.060 * Bakgrunnslagring startet av pid 8672 [8672] 14. mai 14:05:09.169 # Windows-versjonen av Redis reserverer heap-minne fra systemets pagingfil for deling med den forgrenede prosessen som brukes for persistensoperasjoner. For øyeblikket er det ikke tilstrekkelig sammenhengende ledig plass tilgjengelig i systemsidefil. Du kan øke størrelsen på systemets sidesidefil. Noen ganger vil en omstart defragmentere systemets pagingfil tilstrekkelig til at Denne operasjonen ble fullført med suksess.
Redis kan ikke fortsette. Avslutter. [8984] 14. mai 14:05:09.278 # gaffeloperasjon mislyktes
Etter analyse viste det seg at problemet med maksimal heap-størrelse "maxheap"-konfigurasjon skyldtes utilstrekkelig tilgjengelig minne.
Løsning
Åpne Redis sin konfigurasjonsfil "redis.windows.conf" og finn følgende kodeseksjon:
# Redis-heapen må være større enn verdien spesifisert av maxmemory # flagg, siden heap-allokatoren har sine egne minnekrav og # Fragmentering av haugen er uunngåelig. Hvis bare maxmemory-flagget er # spesifisert, Maxheap vil være satt til 1,5*Maxmemory. Hvis maxheap-flagget er # spesifisert sammen med maxmemory, vil maxheap-flagget automatisk være # økt hvis den er mindre enn 1,5*maks minne. # # maxheap <bytes> Å legge til denne innstillingen er bra,Redis-tjenesten klarer ikke å starte!!!!!!!
Standardverdien er: maxheap 10240000000≈976,56M
Jeg fant ikke denne kommentaren i konferansefilen, jeg fant noe som dette:
# Ikke bruk mer minne enn det angitte antallet bytes. # Når minnegrensen er nådd, vil Redis prøve å fjerne nøkler # i henhold til den valgte utkastelsespolicyen (se maxmemory-policy).
# # Hvis Redis ikke kan fjerne nøkler i henhold til retningslinjene, eller hvis retningslinjene er # satt til 'noeviction', vil Redis begynne å svare med feil på kommandoer # som vil bruke mer minne, som SET, LPUSH, og så videre, og vil fortsette # for å svare på skrivebeskyttede kommandoer som GET.
# # Dette alternativet er vanligvis nyttig når man bruker Redis som LRU-cache, eller for å sette # En hard minnegrense for en instans (ved bruk av 'noeviction'-policyen).
# # ADVARSEL: Hvis du har slaver koblet til en instans med maxmemory på, # Størrelsen på utgangsbufferne som trengs for å forsyne slavene trekkes fra # fra antall brukt minne, slik at nettverksproblemer / resynkroniseringer vil # ikke utløse en løkke der nøkler kastes ut, og dermed utgangen # bufferen av slaver er full av DEL-er for nøkler som blir kastet ut, noe som utløser slettingen # av flere nøkler, og så videre til databasen er helt tom.
# # Kort sagt... Hvis du har slaver tilknyttet, anbefales det at du setter en lavere # grense for maksminne slik at det er litt ledig RAM på systemet for slave # utgangsbuffere (men dette er ikke nødvendig hvis policyen er 'noeviction').
# # ADVARSEL: å ikke sette maxmemory vil føre til at Redis terminerer med en # ut-av-minne-unntak hvis heap-grensen nås.
# # MERK: siden Redis bruker systemets pagingfil for å allokere heap-minnet, # arbeidssettets minnebruk vises av Windows Oppgavebehandling eller andre # verktøy som ProcessExplorer vil ikke alltid være nøyaktige. For eksempel, høyre # etter en bakgrunnslagring av RDB- eller AOF-filene, fungerer arbeidssettverdien # kan falle betydelig. For å sjekke riktig mengde minne brukt # ved redis-serveren for å lagre dataene, bruk INFO-klientkommandoen. The INFO #-kommandoen viser bare minnet som brukes til å lagre redis-dataene, ikke det ekstra # minne brukt av Windows-prosessen til sine egne behov. Th3 ekstra beløp # av minne som ikke rapporteres av INFO-kommandoen kan beregnes ved å trekke fra # Peak Working Set rapportert av Windows Oppgavebehandling og used_memory_peak # rapportert av INFO-kommandoen.
# # Maxmemory <bytes> Advarsel: Hvis heap-grensen nås, vil manglende innstilling av maxmemory føre til at Redis avsluttes med et unntak utenfor minnet.
Merk: På grunn avRedis bruker system-pagingfiler for å tildele heapminne,
Windows Oppgavebehandling eller andre verktøy som ProcessExplorer viser ikke alltid nøyaktig bruk av arbeidsminnet. Enkelt sagt,Minnebruken som vises i Oppgavebehandling er ikke nøyaktig!!!
Bruk info-kommandoen for å spørre som følger:
# Minne 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: Ingen utkastelse mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
Innstillingene er som følger:
1073741824 bytes = 1G Etter innstillingen legger redis .net-klienten til en cache-feil som følger:
OOM-kommandoen er ikke tillatt når minne brukes > 'maxmemory'. # MAXMEMORY-POLICY: hvordan Redis velger hva som skal fjernes når maxmemory # er nådd. Du kan velge mellom fem atferder:
# # volatile-lru -> fjern nøkkelen med et utløpssett ved hjelp av en LRU-algoritme # allkeys-lru -> fjerner hvilken som helst nøkkel i henhold til LRU-algoritmen # flyktig-tilfeldig -> fjerner en tilfeldig nøkkel med et utløpssett. # allkeys-random -> fjerner en tilfeldig nøkkel, hvilken som helst nøkkel # volatile-ttl -> fjerner nøkkelen med nærmeste utløpstid (minor TTL) # noeviction -> utløper ikke i det hele tatt, bare returnerer en feil ved skriveoperasjoner
# # Merk: med noen av de ovennevnte retningslinjene vil Redis returnere en feil ved skriving # operasjoner, når det ikke finnes egnede nøkler for utkastelse.
# # På skrivetidspunktet er disse kommandoene: sett setnx setex legg til # 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
# # Standarden er:
# # Maxmemory-policy noevisjon #MAXMEMORY策略: Når MAXMEMORY
#到达. Du kan velge mellom fem atferder:
#
#volatile bruker LRU-> LRU-algoritmen for å fjerne nøkler med utløpssett
#allkeys LRU-> slette hvilken som helst nøkkel i henhold til LRU-algoritmen
#volatile tilfeldig – > fjerne tilfeldige nøkler med utløpte sett
#allkeys tilfeldig > slette tilfeldige nøkler, vilkårlige nøkler
#volatile TTL-> Slett nøkkelen med nærmeste utløpstid (Minor TTL)
#noeviction-> utløper ikke i det hele tatt, returnerer bare skriveoperasjonsfeil
#
#注意: For noen av de ovennevnte strategiene returnerer Redis en feil ved skriving
#操作, når det ikke finnes en egnet nøkkel for utkastelse.
#
#在编写之日 er disse kommandoene: 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 Exec Sortering
#
#默认值为:
#
#maxmemory策略无效 Du må også sette opp følgende konfigurasjoner:
Standard Redis-innstillingen er svært konservativ, det vil si at den ikke lagres etter at minnegrensen er overskredet, og policyen kan endres til LRU-algoritmen (den minst brukte algoritmen nylig) – den nylig lagrede informasjonen vil erstatte den gamle.
Anmeldelse:
(Slutt)
|