Redis önbelleğini StackExchange.Redis kullanarak hata şu şekildedir:
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.
Geçici çözüm, redis.windows.conf dosyasını değiştir,Redis servisi yeniden başlatılmalıdır, aşağıdaki gibi ayarlanmıştır:
Redis servisini yeniden başlatmak istemiyorsanız, redis-cli komutunu kullanarak aşağıdaki şekilde ayarlayabilirsiniz:
Açıklama şöyledir:
# Varsayılan olarak, RDB anlık görüntüleri etkinleştirilirse Redis yazma kabul etmeyi durdurur # (en az bir kayıt noktası) ve en son arka plan kaydı başarısız oldu. # Bu, kullanıcının verinin kalıcı olmadığını (zor bir şekilde) fark etmesini sağlar # diskte düzgünce bulunur, aksi takdirde muhtemelen kimse fark etmez ve bazıları # felaket olacak.
# # Arka plan kaydetme işlemi tekrar çalışmaya başlarsa Redis çalışacak # otomatik olarak tekrar yazma izni ver.
# # Ancak, Redis sunucusunu doğru şekilde izlemeyi kurduysanız # ve ısrar, bu özelliği devre dışı bırakmak isteyebilirsiniz ki Redis # diskle ilgili sorunlar olsa bile her zamanki gibi çalışmaya devam et, # izinler ve benzeri. Basitçe söylemek gerekirse: Redis, ana sürecin veri kaydederken sahte ölüm yapmasını önlemek için ana süreci çatallaması gerekir ve ardından veri kaydetme işlemini çatal sürecinde sabit diske kaydetme işlemini tamamlamalıdır; ana süreç 4GB bellek kullanıyorsa, çatal alt süreci gerektiğinde ek 4GB gerekir, bu anda bellek yeterli değildir, çatal başarısız olur ve veri kaydeden sabit disk de arızalanır. Redis loglarını görüntülemek için redis.windows.conf'u aşağıdaki şekilde yapılandırmanız gerekir:
# Log dosyası adını belirt. Ayrıca 'stdout' zorlamak için kullanılabilir # Standart çıkışa giriş yapmak için Redis var. logfile "E:/Redis-x64-3.2.100/redis.txt" Log istisnaları şunlardır:
[8984] 14 Mayıs 14:05:09.060 * Arka plan kaydı pid 8672 tarafından başlatıldı [8672] 14 Mayıs 14:05:09.169 # Redis'in Windows sürümü, sistem sayfalama dosyasından yığın belleği ayırır Süreklilik işlemleri için kullanılan çatallanmış süreçle paylaşmak için. Şu anda bölgede yeterli bitişik boş alan bulunmamaktadır. sistem sayfa dosyası. Sistem sayfalama dosyasının boyutunu artırabilirsin. Bazen yeniden başlatma işlemi, sistem sayfalama dosyasını yeterince parça parçalarından ayırır bu operasyonun başarıyla tamamlanması sağlandı.
Redis devam edemez. Çıkıyorum. [8984] 14 Mayıs 14:05:09.278 # çatal işlemi başarısız oldu
Analizle, maksimum yığın boyutu "maxheap" konfigürasyonundaki sorunun yetersiz bellek nedeniyle olduğu ortaya çıktı.
Çözüm
Redis'in yapılandırma dosyası "redis.windows.conf"u açın ve aşağıdaki kod bölümünü bulun:
# Redis yığını, maxmemory tarafından belirtilen değerden büyük olmalıdır # bayrağı, çünkü hep alyatıcısının kendi bellek gereksinimleri vardır ve # Yığının parçalanması kaçınılmazdır. Sadece maxmemory bayrağı # Belirtildi, MaxHeap 1.5*maxmemory olarak ayarlanır. Eğer maxheap bayrağı # Maxmemory ile birlikte belirtilirse, maxheap bayrağı otomatik olarak # 1.5*maxmemory'den küçükse artırılır. # # Maxheap <bytes> Bu ayarı eklemek iyi,Redis servisi çalışmadı!!!!!!!
Varsayılan değer: maxheap 1024000000≈976.56M'dir
Bu yorumu conf dosyasında bulamadım, şöyle bir şey buldum:
# Belirtilen bayt miktarından fazla bellek kullanmayın. # Bellek sınırına ulaşıldığında Redis anahtarları kaldırmaya çalışacak # Seçilen tahliye politikasına göre (bkz. maxmemory-policy).
# # Redis anahtarları politikaya göre kaldıramazsa ya da politika # 'noeviction' olarak ayarlandığında, Redis komutlara hatalarla yanıt vermeye başlar # daha fazla bellek kullanacak, mesela SET, LPUSH gibi ve devam edecek # GET gibi sadece okunabilir komutlara yanıt vermek için.
# # Bu seçenek genellikle Redis LRU önbelleği olarak kullanılırken veya ayarlarken faydalıdır. # bir örnek için sabit bellek sınırı ('noeviction' politikası kullanılarak).
# # UYARI: Maxmemory açık bir instance'a bağlı slave'leriniz varsa, # Slave'leri beslemek için gereken çıkış tamponlarının boyutu çıkarılır # kullanılan bellek sayısından, böylece ağ sorunları / yeniden senkronizasyonlar # tuşların çıkarıldığı bir döngüyü tetiklememek, böylece çıkış # Slave tamponu çıkarılmış anahtarların DEL'leriyle dolu ve silinmeyi tetikliyor # daha fazla anahtar ve benzeri devam eder, veritabanı tamamen boşalana kadar.
# # Kısacası... Eğer köleler bağlıysa, daha düşük bir ayar ayarlamanız önerilir # maksimum bellek için limit verin, böylece sistemde slave için biraz boş RAM kalsın # çıkış tamponları (ancak politika 'eviction' ise bu gerekli değildir).
# # UYARI: maxmemory ayarlanmazsa, Redis'in bir # Heap sınırına ulaşılırsa hafıza dışı istisna.
# # NOT: Redis, heap belleği tahsis etmek için sistem sayfalama dosyasını kullandığından, # Windows Görev Yöneticisi veya diğer kişiler tarafından gösterilen Çalışma Seti bellek kullanımı # ProcessExplorer gibi araçlar her zaman doğru olmayacaktır. Örneğin, doğru # RDB veya AOF dosyalarının arka plan kaydından sonra, çalışma kümesi değeri # önemli ölçüde düşebilir. Doğru kullanılan bellek miktarını kontrol etmek için # redis-server tarafından veriyi depolamak için INFO istemci komutunu kullanın. The INFO # komutu sadece redis verilerini depolamak için kullanılan belleği gösterir, ekstra veri değil # Windows sürecinin kendi gereksinimleri için kullandığı bellek. Th3 ekstra miktar INFO komutu tarafından bildirilmeyen bellek # hesaplanarak # Windows Görev Yöneticisi ve used_memory_peak tarafından bildirilen Zirve Çalışma Seti # INFO komutası tarafından bildirildi.
# # Maxmemory <bytes> Uyarı: Heap sınırına ulaşılırsa, maxmemory ayarlanmaması Redis'in bir hafıza dışı istisna ile sonlanmasına neden olur.
Not: NedeniRedis, heap belleği tahsis etmek için sistem sayfalama dosyalarını kullanır,
Windows Görev Yöneticisi veya ProcessExplorer gibi diğer araçlar her zaman doğru iş seti bellek kullanımını göstermez. Basitçe söylemek gerekirse,Görev Yöneticisi'nin gösterdiği bellek kullanımı doğru değil!!!
Bilgi komutunu kullanarak aşağıdaki şekilde sorgulayın:
# Hafıza 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
Ayarlar şu şekildedir:
1073741824 bayt = 1G Ayardan sonra, redis .net istemcisi aşağıdaki gibi bir önbellek hatası ekler:
'maxmemory' bellek kullanıldığında OOM komutu > izin verilmiyor. # MAXMEMORY POLITIKASI: Redis'in maxmemory olduğunda neyi kaldıracağını nasıl seçeceği # ulaşıldı. Beş davranış arasından seçim yapabilirsiniz:
# # volatile-lru -> LRU algoritması kullanılarak süresi dolmuş bir setle anahtarı kaldırın # allkeys-lru -> LRU algoritmasına göre herhangi bir anahtarı kaldırın # volatile-random -> süresi dolmuş bir anahtarı kaldır # allkeys-random -> rastgele bir anahtarı kaldır, herhangi bir anahtarı # volatile-ttl -> en yakın son kullanma süresine sahip anahtarı kaldır (küçük bir zaman çizelgesi) # Noeviction -> hiç süresi dolmuyor, sadece yazma işlemlerinde hata döndür
# # Not: Yukarıdaki politikalardan herhangi biriyle Redis yazma hatası döndürecektir # tahliye için uygun anahtar olmadığı operasyonlar.
# # Bu komutların yazıldığı tarihte şöyledir: set setnx setex append # incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd # sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx yönetici sıralaması
# # Varsayılan şudur:
# # maxmemory-politika evilasyonu #MAXMEMORY策略: MAXMEMORY
#到达. Beş davranıştan birini seçebilirsiniz:
#
#volatile LRU->, süresi dolmuş anahtarları kaldırmak için LRU algoritmasını kullanır
#allkeys LRU-> LRU algoritmasına göre herhangi bir anahtarı silir
#volatile rastgele - > süresi dolmuş anahtarları kaldır
#allkeys rastgele > rastgele anahtarları, keyfi anahtarları sil
#volatile TTL-> En yakın son kullanma süresine sahip anahtarı sil (Küçük TTL)
#noeviction-> hiç süresi dolmaz, sadece yazma işlemi hatalarını döndürür
#
#注意: Yukarıdaki stratejilerden herhangi biri için, Redis yazma sırasında hata döndürür
#操作, tahliye için uygun bir anahtar olmadığında.
#
#在编写之日 bu komutlar şunlardır: setnx setex ekle
#递增递减rpush lpushx lpushx linsert lset rpoplpush sadd
#烧结店sunion sunionstore sdiff sdiffstore zadd zincrby
#zunionstore Zinterstore Hset Hsetnx HMSET Hincrby Incrby Decrby
#getset MSET MSETNX yönetici sıralaması
#
#默认值为:
#
#maxmemory策略无效 Ayrıca aşağıdaki yapılandırmaları kurmanız gerekir:
Varsayılan redis ayarı çok muhafazakardır; yani, bellek sınırı aşıldıktan sonra saklanmaz ve politika LRU algoritmasına (son zamanlarda en az kullanılan algoritma) değiştirilebilir - yeni depolanan bilgiler eski bilginin yerini alır.
Eleştiri:
(Son)
|