A StackExchange.Redis használatával a redis gyorsítótár manipulálására a hiba a következő:
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.
Ideiglenes megoldás, módosítsa a redis.windows.conf fájlt,A Redis szolgáltatást újra kell indítani., a következőképpen halva:
Ha nem akarod újraindítani a Redis szolgáltatást, a redis-cli parancsot a következőképpen állíthatod be:
A magyarázat a következő:
# Alapértelmezés szerint a Redis nem fogad el írásokat, ha az RDB snapshotok engedélyezve vannak # (legalább egy mentési pont) és a legutóbbi háttérmentés meghibásodott. # Ez tudatná a felhasználónak (kemény módon), hogy az adatok nem maradnak fenn # rendesen a lemezen, különben valószínűleg senki sem veszi észre, és még sok # katasztrófa fog történni.
# # Ha a háttérmentés újra működésbe fog indulni, Redis is fog # automatikusan engedélyezi az írásokat újra.
# # Azonban, ha beállítottad a Redis szerver megfelelő megfigyelését # és kitartás, érdemes lehet letiltani ezt a funkciót, hogy Redis # továbbra is a szokásos módon működünk, még akkor is, ha problémák vannak a lemezrel, # engedélyek és így tovább. Egyszerűen fogalmazva: A Redisnek el kell forkálnia egy fő folyamatot, hogy elkerülje a fő folyamat halálszínlelését adatmentéskor a merevlemezre, majd befejezze az adatmentést a merevlemezre a fork folyamatban, ha a fő folyamat 4GB memóriát használ, akkor egy további 4GB szükség van a fork alfolyamatra, ekkor a memória nem elég, a fork meghibásodik, és akkor az adatmentő merevlemez is meghibásodik. A redis naplók megtekintéséhez a redis.windows.conf-ot a következőképpen kell konfigurálni:
# Megadd a naplófájl nevét. A 'stdout' is használható kényszerítésre # Redis a standard kimenetre jelentkezik. naplófájl "E:/Redis-x64-3.2.100/redis.txt" A napló kivételek a következők:
[8984] 14. május 14:05:09.060 * Háttérmentést indított: pid 8672 [8672] 14. május 14:05:09.169 # A Redis Windows verziója tart fenn halom memóriát a rendszer lapozó fájljából A tartóssági műveletekhez használt forkált folyamattal való megosztáshoz. Jelenleg nem áll rendelkezésre elegendő egymás melletti szabad hely a Rendszeroldali fájl. Növelheted a rendszer lapozási fájl méretét. Néha egy újraindítás elegendő módon defragmentálja a rendszer lapozási fájlt a következőképpen ezt a műveletet sikeresen befejezték.
Redis nem tud folytatni. Kilép. [8984] 14. május 14:05:09.278 # villá művelet sikertelen
Az elemzés után kiderült, hogy a maximális halom méretű "maxheap" konfiguráció problémája a rendelkezésre álló memória hiányából fakadt.
Megoldás
Nyisd meg a Redis konfigurációs fájlját "redis.windows.conf", és keresd meg a következő kódszekciót:
# A Redis halomnak nagyobbnak kell lennie, mint a maxmemory által megadott érték # zászló, mivel a halom allokátornak saját memóriaigényei vannak és # a kupac széttörése elkerülhetetlen. Ha csak a maxmemory zászló # Megadva, a maxheap 1,5*maxmemory-re lesz beállítva. Ha a maxheap zászló # A maxmemory mellett a maxheap zászló automatikusan lesz # növelve, ha kisebb, mint 1,5*maxmemory. # # maxheap <bytes> Ennek a beállításnak a hozzáadása jó,A Redis szolgáltatás nem indul el!!!!!!!
Az alapértelmezett érték: maxheap 1024000000≈976,56M
Ezt a hozzászólást nem találtam a conf fájlban, valami ilyesmit találtam:
# Ne használj több memóriát a megadott mennyiségű bájtnál. # Amikor eléri a memóriahatárt, Redis megpróbálja eltávolítani a kulcsokat # a kiválasztott kilakoltatási szabályzat szerint (lásd maxmemory-politika).
# # Ha a Redis nem tudja eltávolítani a kulcsokat a szabályzat szerint, vagy ha a szabályzat # beállítása 'noeviction'-re, Redis hibákkal válaszol a parancsokra # ami több memóriát igényelne, mint a SET, LPUSH és így tovább, és folytatódik # válasz csak olvasható parancsokra, mint a GET.
# # Ez az opció általában hasznos, ha a Redis LRU cache-ként vagy beállításokhoz # egy példány kemény memóriakorlátja (a 'noeviction' szabályzat alapján).
# # FIGYELEM: Ha egy instance-hoz maxmemory be van kapcsolva slave-ek hozzá, # a szolgák táplálásához szükséges kimeneti pufferek mérete levonva # a használt memória számából, így a hálózati problémák / újraszinkronizálások # nem indít el egy hurkot, ahol a kulcsok kilakoltatása lesz, és ezzel a kimenet # a slave-puffer tele van DEL-ekkel a kulcsok kizárásával, ami kiváltja a törlést # további kulcsok, és így tovább, amíg az adatbázis teljesen ki nem ürül.
# # Röviden... Ha szolgák vannak csatlakoztatva, ajánlott alacsonyabb szintet állítani # maxmemory korlát, hogy legyen némi szabad RAM a rendszerben a slave-hez # kimeneti pufferek (de ez nem szükséges, ha a szabályzat 'noeviction').
# # FIGYELEM: a maxmemory beállítása miatt Redis egy # memóriakívüli kivétel, ha elérik a halom határát.
# # MEGJEGYZÉS: mivel a Redis a rendszerlapozó fájlt használja a halommemória kijelölésére, # a Windows Feladatkezelő vagy más által mutatott munkakészlet memóriahasználata # olyan eszközök, mint a ProcessExplorer nem mindig lesznek pontosak. Például, jobb # az RDB vagy az AOF fájlok háttérmentése után a munkahalmaz értéke # jelentősen csökkenhet. Hogy ellenőrizzük, mennyi memóriát használunk # a redis-szerver által az adatok tárolásához használja az INFO kliens parancsot. Az INFO # parancs csak a Redis adatok tárolásához használt memóriát mutatja, nem a plusz # memória, amelyet a Windows folyamat saját igényeihez használ. Th3 extra összeg # memóriából, amelyet az INFO parancs nem jelent, kiszámítható a # A Windows Feladatkezelő és a used_memory_peak által jelentett csúcsmunkakészlet # jelentették az INFO parancsnokságtól.
# # maxmemory <bytes> Figyelem: Ha eléri a halmos korlátot, a maxmemory beállítás nélkül Redis egy memóriakívüli kivétellel végződik.
Megjegyzés: MivelA Redis rendszerlapozó fájlokat használ a halommemória leosztásához,
A Windows Feladatkezelő vagy más eszközök, mint a ProcessExplorer, nem mindig mutatnak pontos munkakészlet-memóriahasználatot. Egyszerűen fogalmazva,A Feladatkezelő által mutatott memóriahasználat nem pontos!!!
Az info parancsot az alábbiak szerinti lekérdezésre használd:
# Emlék 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
A beállítások a következők:
1073741824 bájt = 1G A beállítás után a redis .net kliens a következő gyorsítótár hibát adja hozzá:
Az OOM parancs nem engedélyezett, ha 'maxmemory' > memóriát használta. # MAXMEMORY POLITIKA: hogyan választja ki a Redis, mit távolít el, amikor maxmemory # elérik. Öt viselkedés közül választhatsz:
# # volatile-lru -> a kulcs eltávolítása lejáró halmazsal LRU algoritmussal # allkeys-lru -> eltávolítsa bármely kulcsot az LRU algoritmus szerint # volatile-random -> távolíts el egy véletlenszerű kulcsot lejárt halmazsal # allkeys-random -> távolítsd el egy véletlenszerű kulcsot, bármelyik kulcsot # volatile-ttl -> távolítsd el a legközelebbi lejárati idővel rendelkező kulcsot (kisebb TTL) # Noeviction -> egyáltalán nem jár le, csak írni a műveleteknél hibát küldj vissza
# # Megjegyzés: bármelyik fenti szabályzatnál a Redis íráskor hibát ad vissza # műveletek, amikor nincsenek megfelelő kulcsok a kilakoltatáshoz.
# # A parancsok írásának időpontjában a következők: setnx setex append # incr decr rpush lpush lpushx 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
# # Az alapértelmezett:
# # maxmemory-politika kizárása #MAXMEMORY策略: Amikor MAXMEMORY
#到达. Öt viselkedés közül választhatsz:
#
#volatile LRU-> az LRU algoritmust használja a lejárati halmazok eltávolítására
#allkeys LRU-> az LRU algoritmus szerint bármely kulcsot töröl
#volatile véletlenszerű – > eltávolítsa a véletlenszerű kulcsokat lejárt halmazokkal
#allkeys véletlenszerű-> töröld véletlenszerű kulcsokat, tetszőleges kulcsokat
#volatile TTL-> Töröld a legközelebbi lejárati idővel rendelkező kulcsot (kisebb TTL)
#noeviction-> egyáltalán nem jár le, csak írási műveleti hibákat ad vissza
#
#注意: Bármelyik fenti stratégiánál a Redis hibát ad vissza íráskor
#操作, amikor nincs megfelelő kulcs a kilakoltatáshoz.
#
#在编写之日 ezek a parancsok: setnx setex append beállítás
#递增递减rpush lpushx lpushx linsert lset rpoplpush sadd
#烧结店sunion sunionstore sdiff sdiffstore zadd zincrby
#zunionstore Zinterstore Hset Hsetnx HMSET Hincrby Incrby Decrby
#getset MSET MSETNX végrehajtó rendezés
#
#默认值为:
#
#maxmemory策略无效 Az alábbi konfigurációkat is be kell állítanod:
Az alapértelmezett redis beállítás nagyon konzervatív, vagyis nem tárolják a memóriakorlát túllépése után, és a politika megváltoztatható az LRU algoritmusra (ami az utóbbi időben legkevésbé használt algoritmus) – az újonnan tárolt információ leváltja a régi információkat.
Szemle:
(Vége)
|