Ved brug af StackExchange.Redis til at manipulere redis-cachen er fejlen 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, modificerer filen redis.windows.conf,Redis-tjenesten skal genoptages, sat som følger:
Hvis du ikke vil genstarte Redis-tjenesten, kan du bruge redis-cli-kommandoen til at sætte den op som følger:
Forklaringen er som følger:
# Som standard vil Redis stoppe med at acceptere skrivninger, hvis RDB-snapshots er aktiveret # (mindst ét gemmepunkt) og den seneste baggrundslagring fejlede. # Dette vil gøre brugeren opmærksom (på en hård måde), at data ikke bevares # på disk ordentligt, ellers er chancerne for, at ingen vil opdage det og lidt til # katastrofe vil ske.
# # Hvis baggrundsgemningen begynder at virke igen, vil Redis # tillad automatisk skrivning igen.
# # Men hvis du har sat din korrekte overvågning af Redis-serveren op # og vedholdenhed, du vil måske deaktivere denne funktion, så Redis kan gøre det # fortsæt med at arbejde som normalt, selvom der er problemer med disken, # tilladelser og så videre. Kort sagt: Redis skal forke en hovedproces for at undgå, at hovedprocessen foregiver død, når data gemmes på harddisken, og derefter fuldføre processen med at gemme data på harddisken i fork-processen; hvis hovedprocessen bruger 4 GB hukommelse, kræves yderligere 4 GB, når fork-underprocessen er nødvendig, på dette tidspunkt er hukommelsen ikke nok, forken fejler, og derefter fejler datalagringsharddisken også. For at se redis-logfilerne skal du konfigurere redis.windows.conf som følger:
# Angiv logfilens navn. Også 'stdout' kan bruges til at tvinge # Redis for at logge på standardoutputtet. logfil "E:/Redis-x64-3.2.100/redis.txt" Log-undtagelserne er som følger:
[8984] 14. maj 14:05:09.060 * Baggrundsgemning startet af pid 8672 [8672] 14. maj 14:05:09.169 # Windows-versionen af Redis reserverer heap-hukommelse fra systemets pagingfil til deling med den forgrenede proces, der bruges til persistensoperationer. På nuværende tidspunkt er der ikke tilstrækkelig sammenhængende fri plads tilgængelig i Systemsidefil. Du kan øge størrelsen på systemets pagingfil. Nogle gange vil en genstart defragmentere systemets pagingfil tilstrækkeligt til at Denne operation skal gennemføres med succes.
Redis kan ikke fortsætte. Ud. [8984] 14. maj 14:05:09.278 # gaffeloperationen mislykkedes
Efter analyse viste det sig, at problemet med den maksimale heap-størrelse "maxheap"-konfiguration skyldtes utilstrækkelig tilgængelig hukommelse.
Opløsning
Åbn Redis' konfigurationsfil "redis.windows.conf" og find følgende kodeafsnit:
# Redis-heapen skal være større end den værdi, der er angivet af maxmemory # flag, da heap-allokatoren har sine egne hukommelseskrav og # Fragmentering af bunken er uundgåelig. Hvis kun maxmemory-flaget er # specificeret, maxheap vil være sat til 1,5*maxmemory. Hvis maxheap-flaget er # specificeret sammen med maxmemory, vil maxheap-flaget automatisk blive angivet # forhøjet, hvis den er mindre end 1,5*maxmemory. # # maxheap <bytes> At tilføje denne indstilling er godt,Redis-tjenesten starter ikke!!!!!!!
Standardværdien er: maxheap 10240000000≈976,56M
Jeg fandt ikke denne kommentar i konferencefilen, jeg fandt noget i stil med dette:
# Brug ikke mere hukommelse end det angivne antal bytes. # Når hukommelsesgrænsen nås, vil Redis forsøge at fjerne nøgler # ifølge den valgte udsættelsespolitik (se maxmemory-policy).
# # Hvis Redis ikke kan fjerne nøgler i henhold til politikken, eller hvis politikken er # sat til 'noeviction', vil Redis begynde at svare med fejl på kommandoer # der ville bruge mere hukommelse, som SET, LPUSH og så videre, og vil fortsætte # for at svare på skrivebeskyttede kommandoer som GET.
# # Denne mulighed er som regel nyttig, når man bruger Redis som en LRU-cache eller til at sætte # En hård hukommelsesgrænse for en instans (ved brug af 'noeviction'-politikken).
# # ADVARSEL: Hvis du har slaver tilknyttet en instans med maxmemory slået til, # Størrelsen af de outputbuffere, der er nødvendige for at forsyne slaverne, trækkes fra # fra brugte hukommelsesmængder, så netværksproblemer / resynkroniseringer vil # ikke udløse en løkke, hvor nøgler bliver smidt ud, og dermed outputtet # buffer af slaver er fyldt med DEL'er for nøgler, der er blevet fjernet, hvilket udløser sletningen # af flere nøgler, og så videre, indtil databasen er helt tømt.
# # Kort sagt... Hvis du har slaver tilknyttet, anbefales det, at du sætter en lavere # begrænsning for maxmemory, så der er noget ledig RAM på systemet til slave # outputbuffere (men dette er ikke nødvendigt, hvis politikken er 'noeviction').
# # ADVARSEL: hvis du ikke sætter maxmemory, vil Redis afslutte med en # ud-af-hukommelsen undtagelse, hvis heap-grænsen nås.
# # BEMÆRK: da Redis bruger systemets pagingfil til at allokere heap-hukommelsen, # arbejdssættets hukommelsesforbrug vist af Windows Jobliste eller andre # værktøjer som ProcessExplorer vil ikke altid være nøjagtige. For eksempel, højre # efter en baggrundsgemning af RDB- eller AOF-filerne, arbejdsmængdens værdi # kan falde markant. For at kontrollere den korrekte mængde hukommelse, der bruges. # ved redis-serveren til at gemme dataene, brug INFO-klientkommandoen. The INFO #-kommandoen viser kun den hukommelse, der bruges til at gemme redis-dataene, ikke den ekstra # hukommelse, som Windows-processen bruger til sine egne behov. Th3 ekstra beløb # af hukommelse, der ikke rapporteres af INFO-kommandoen, kan beregnes ved at trække fra # Peak Working Set rapporteret af Windows Jobliste og used_memory_peak # rapporteret af INFO-kommandoen.
# # maxmemory <bytes> Advarsel: Hvis heap-grænsen nås, vil manglende indstilling af maxmemory få Redis til at afslutte med en out-of-memory-undtagelse.
Bemærk: På grund afRedis bruger systemsidefiler til at allokere heap-hukommelse,
Windows Jobliste eller andre værktøjer som ProcessExplorer viser ikke altid nøjagtig brug af arbejdsmængdehukommelsen. Enkelt sagt,Det hukommelsesforbrug, der vises af Joblisten, er ikke nøjagtigt!!!
Brug info-kommandoen til at forespørge som følger:
# Hukommelse 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 udsættelse mem_fragmentation_ratio:1.00 mem_allocator:jemalloc-3.6.0
Indstillingerne er som følger:
1073741824 bytes = 1G Efter indstillingen tilføjer redis .net-klienten en cache-fejl som følger:
OOM-kommandoen er ikke tilladt, når den bruges hukommelse > 'maxmemory'. # MAXMEMORY POLITIK: hvordan Redis vælger, hvad der skal fjernes, når maxmemory # er nået. Du kan vælge mellem fem adfærdsmønstre:
# # flygtig-lru -> fjerner nøglen med udløbssæt ved hjælp af en LRU-algoritme # allkeys-lru -> fjerner enhver nøgle ifølge LRU-algoritmen # flygtig-tilfældig -> fjerner en tilfældig nøgle med et udløbssæt # allkeys-random -> fjerner en tilfældig nøgle, hvilken som helst nøgle # flygtig-ttl -> fjern nøglen med nærmeste udløbstid (mindre TTL) # noeviction -> udløber slet ikke, returnerer bare en fejl ved skriveoperationer
# # Bemærk: med nogen af ovenstående politikker vil Redis returnere en fejl ved skrivning # Operationer, når der ikke findes egnede nøgler til udsættelse.
# # På skrivetidspunktet er disse kommandoer: sæt setnx setex tilføj # 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-politik noevition #MAXMEMORY策略: Når MAXMEMORY
#到达. Du kan vælge mellem fem adfærdsmønstre:
#
#volatile bruger LRU-> LRU-algoritmen til at fjerne nøgler med udløbsmængder
#allkeys LRU-> slette enhver nøgle ifølge LRU-algoritmen
#volatile tilfældigt - > fjerner tilfældige nøgler med udløbne sæt
#allkeys tilfældige > sletter tilfældige nøgler, vilkårlige nøgler
#volatile TTL-> Slet nøglen med nærmeste udløbstid (Minor TTL)
#noeviction-> udløber slet ikke, returnerer kun fejl i skriveoperationer
#
#注意: For en af ovenstående strategier returnerer Redis en fejl ved skrivning
#操作, når der ikke findes en passende nøgle til udsættelse.
#
#在编写之日 er disse kommandoer: 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 executive sortering
#
#默认值为:
#
#maxmemory策略无效 Du skal også sætte følgende konfigurationer op:
Standard Redis-indstillingen er meget konservativ, det vil sige, den gemmes ikke efter hukommelsesgrænsen er overskredet, og politikken kan ændres til LRU-algoritmen (den mindst brugte algoritme for nylig) – den nyligt lagrede information vil erstatte den gamle information.
Anmeldelse:
(Slut)
|