Redis: Anahtarlar için veritabanı boyutunu / boyutunu göster


91

Redis örneğim çok büyüyor gibi görünüyor ve sahip olduğum çoklu veritabanlarından hangisinin ne kadar hafıza tükettiğini öğrenmek istiyorum. Redis'in INFOkomutu bana sadece veritabanı başına toplam boyutu ve anahtar sayısını gösteriyor ki bu bana çok fazla fikir vermiyor ... Yani redis sunucusunu izlerken bana daha fazla bilgi veren herhangi bir araç / fikir takdir edilecektir.

Redis dokümantasyonu bana belirli tuşların tüketilen belleğini döndürebilecek herhangi bir komut göstermiyor, bu yüzden eğer herhangi bir hatalı kod yeniden yapmak için çok fazla "çöp" yazarsa, bunu bulması gerçekten zor olabilir ...

Yanıtlar:


115

Bu yüzden kendi sorunuma çözümüm: redis-cliBiraz daha oynadıktan sonra , anahtar DEBUG OBJECT <key>gibi bir şeyi açığa çıkardığını öğrendim serializedlength, ki bu aslında aradığım bir şeydi ...

Bütün bir veritabanı için KEYS *, seçtiğiniz bir betik dili ile çok zor olmaması gereken tüm değerleri toplamanız gerekir ...

Kötü olan şey, redis.io'nun hakkında pek fazla bilgiye sahip olmamasıdır DEBUG OBJECT.


1
Serileştirilmiş uzunluk tüm nesnenin bayt cinsinden boyutu mu?
raffian

18
@BernhardVallant, cevabınız için teşekkürler. Devam ettim ve tüm anahtarları ve boyutlarını insan tarafından okunabilir bir biçimde yazdıran hızlı bir komut dosyası yazdım. Paylaşacağımı düşündüm. :) gist.github.com/epicserve/5699837
Brent O'Connor

13
Serileştirilmiş uzunluğun değeri bellek boyutuyla ilgili değildir! Diskteki bir RDB dosyasına kaydedildiğinde nesnelerin alacağı boyuttur. Kaynak kodunu kontrol edin: github.com/antirez/redis/blob/… ve github.com/antirez/redis/blob/…
Hugo Tavares

bellekte anahtarın, değerin veya anahtar / değer çiftinin boyutunu almanın bir yolu yok gibi görünüyor (Diske atılan boyut değil)
Avner Barr

4
Bilginize: AWS ElastiCache Redis'de DEBUG ile hiçbir şey denemeyin, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Hatta bulundu Redis-cli --bigkeys durak olur
sonjz


41

MEMORY USAGE key command size bir anahtarın ve değerinin RAM'de depolanması gereken bayt sayısını verir.

Bildirilen kullanım, bir anahtarın değerinin gerektirdiği veri ve yönetimsel ek yükler için toplam bellek ayırmalarıdır (kaynak yeniden belgeleme)


13
bu sadece sürüm> 4.0 kullanılabilir
teik

15

Bu projeye bir göz atın, normal ifadelere ve öneklere dayalı olarak anahtar uzayları hakkında bazı ilginç istatistikler çıkarır. DEBUG OBJECTKomutu kullanır ve db'yi tarar, anahtar gruplarını tanımlar ve kapladıkları alan yüzdesini tahmin eder.

https://github.com/snmaynard/redis-audit

Çıktı şuna benzer:

Summary  

---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
Key                                                | Memory Usage | Expiry Proportion | Last Access Time                                    
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
notification_3109439                               | 88.14%       | 0.0%              | 2 minutes                               
user_profile_3897016                               | 11.86%       | 99.98%            | 20 seconds  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  

Veya şu: https://github.com/sripathikrishnan/redis-rdb-tools bir dump.rdb dosyasını çevrimdışı olarak analiz ederek tüm anahtar alanı üzerinde tam bir analiz yapar. Bu da iyi çalışıyor. Size db'nizdeki girişler için ortalama / min / maksimum boyutu verebilir ve hatta bunu bir öneke göre yapar.


8

Redis anahtarlarını örneklemeyi ve bunları türe göre gruplamayı çok yararlı bulabilirsiniz. Salvatore, yaklaşık 10.000 komut ve ardından alınan anahtarlar üzerinde çalışan redis-örnekleyici adlı bir araç yazdı . Birkaç saniye veya dakika içinde, anahtar türlerinin dağılımının oldukça doğru bir görünümünü elde etmelisiniz.RANDOMKEYTYPE

Size ne tür uygulama anahtarları hakkında bir fikir veren (hangi adlandırma yapısına göre olursanız olun kullanarak), Redis'te saklanır. Yeniden-örnekleyicinin daha genel çıktısıyla birleştiğinde, bu size neler olup bittiğine dair son derece iyi bir fikir verecektir.


7
Tks, aslında banaredis-cli --bigkeys
nmat

4

Belki db dosyasında biraz iç gözlem yapabilirsiniz. Protokol nispeten basittir (ancak iyi belgelenmemiştir), bu nedenle hangi anahtarların çok fazla yer kapladığını belirlemek için bir ayrıştırıcı yazabilirsiniz.


Yeni öneriler:

Yazılanları MONITORcanlı görmek için kullanmayı denediniz mi? Belki de sorunu hareket halindeki verilerle bulabilirsiniz.


İlginç görünüyor, ancak yine de sunucudaki redis'in bellek tüketimini izlemenin kolay bir yolunu bulmaya çalışıyorum ... Dökümü incelemek, benim için hata ayıklama için daha pratik görünüyor, dökümü birkaç tane olduğundan bahsetmeye gerek yok konserler şimdi!
Bernhard Vallant

Redis e-posta listesine sormalısınız. Bunun için "en iyi" cevabı duymak gerçekten ilginç.
Donald Miner

Zaten denedim INFOve MONITORasıl sorun, redis'i izlemediğinde gerçekten büyüdü ...
Bernhard Vallant

Tamam, e-posta listelerine gönderdim, ancak kendi başıma da bir cevap buldum ... Aşağıya bakın!
Bernhard Vallant

yeniden. db dosyasında iç gözlem - dump.rdb dosyalarını ayrıştırmak için bir komut dosyası yazdım ve her anahtar tarafından kullanılan yaklaşık belleği bildiren bir csv dosyası çıkardım. Bkz. Github.com/sripathikrishnan/redis-rdb-tools
Sripathi Krishnan


2

Bu tür senaryoları gidermek için genellikle anahtar örnekleme yöntemini tercih ederim.

redis-cli -p 6379 -n db_number --bigkeys

Örneğin:-

redis-cli -p 6370 -n 0 --bigkeys


Bu neden "anahtar örnekleme" yöntemi? Sadece buzdağının tepesini gösterdiği için çok sınırlı buluyorum.
MrR

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.