Çoklu Redis Veritabanlarının Amacı Nedir?


159

Bu nedenle, redis'te sakladığım verileri ayrı veritabanlarına bölmek istediğim bir yere geldim, çünkü bazen belirli bir tür veri üzerinde keys komutunu kullanmam gerekiyor ve bunu daha hızlı hale getirmek için ayırmak istedim .

Birden fazla veritabanına ayrılırsam, her şey hala tek iş parçacıklıdır ve yine de yalnızca bir çekirdeği kullanırım. Aynı kutuda başka bir Redis örneği başlatırsam, fazladan bir çekirdek kullanırım. Bunun da ötesinde, Redis veritabanlarını adlandıramıyorum veya onlara daha mantıklı bir tanımlayıcı veremiyorum. Tüm bunlarla birlikte, neden / ne zaman istediğim her ekstra veritabanı için fazladan bir Redis örneği döndürmek yerine birden fazla Redis veritabanı kullanmak isteyeyim? Ve ilgili olarak, Redis neden eklediğim her ekstra veritabanı için fazladan bir çekirdek kullanmaya çalışmıyor? Veritabanlarında tek iş parçacıklı olmanın avantajı nedir?


Node.js uygulamanızda bunu yapın ---> module.exports = {"1": "redis db one için adınız", "2": "redis db two için adınız", "3": " redis db three "} etc için isim veya anahtar ve değerleri istediğiniz gibi değiştirin
Alexander Mills

1
Redis 2.8.0 ve sonraki sürümlerde, KEYS yerine SCAN kullanmanız önerilir, çünkü aynı anda az sayıda öğe üzerinde yinelenir (böylece sunucuyu uzun süre engellemez).
TryHarder

Yanıtlar:


85

Prensipte, aynı örnekteki Redis veritabanları, RDBMS veritabanı örneklerindeki şemalardan farklı değildir.

Tüm bunlarla birlikte, neden / ne zaman istediğim her ekstra veritabanı için fazladan bir Redis örneği döndürmek yerine birden fazla Redis veritabanı kullanmak isteyeyim?

Aynı redis örneğinde redis veritabanlarını kullanmanın açık bir avantajı vardır ve bu da yönetimdir. Her uygulama için ayrı bir örnek oluşturursanız ve diyelim ki 3 uygulamanız var, bu her biri üretimde HA için bir köle ihtiyacı olacak olan 3 ayrı redis örneği, yani toplam 6 örnek. Yönetim açısından, bu çok hızlı olur çünkü hepsini izlemeniz, yükseltmeler / yamalar vb. Yapmanız gerekir. Yüksek G / Ç ile redisleri aşırı yüklemeyi planlamıyorsanız, bir köle ile tek bir örnek daha basit ve SLA'nıza uygun olması koşuluyla yönetimi daha kolaydır.


25
Birden çok Redis örneği her zaman gidilecek yoldur. Dönemi. Farklı veriler için paralel sorgular çalıştırın. CICD boru hattınız sizin için önbellek kümeleri oluşturmuyorsa, onu düzeltin, değilsiniz ...
Anlaşılacaksınız

3
Bu OP puanlarına değinmez: (1) Redis neden her ekstra veritabanı için fazladan bir çekirdek kullanmaya çalışmaz? (2) Veritabanlarında tek iş parçacıklı olmanın avantajı nedir?
ives

93

Tek bir redis örneğinde birden çok veritabanı kullanmak istemezsiniz. Kullanımdan kaldırılmıştır ve belirttiğiniz gibi, birden çok örnek birden çok çekirdekten yararlanmanıza olanak tanır. Veritabanı seçimini kullanırsanız, yükseltme yaparken yeniden düzenleme yapmanız gerekir. Birden fazla örneği izlemek ve yönetmek zor ve acı verici değildir.

Gerçekten de, her bir db'de, örneğe dayalı olarak ayırma yoluyla çok daha iyi metrikler elde edersiniz. Her örnek, daha iyi ayarlama, daha duyarlı ve doğru izleme olanağı sağlayabilecek veri segmentini yansıtan istatistiklere sahip olacaktır. Son bir sürümü kullanın ve verilerinizi örnek olarak ayırın.

Jonaton'un dediği gibi, keys komutunu kullanmayın. Sadece bir anahtar dizini oluşturursanız çok daha iyi bir performans bulacaksınız. Bir anahtar eklerken, anahtar adını bir gruba ekleyin. Keys komutu, ölçeklendirildikten sonra çok yararlı değildir, çünkü geri dönmesi önemli zaman alacaktır.

Erişim düzeninin, verilerinizi nasıl düşündüğünüzü depolamak yerine nasıl yapılandıracağınızı belirlemesine ve sonra daha sonra nasıl erişeceğinizi ve küçültebileceğini bulmasına izin verin. Çok daha iyi bir performans göreceksiniz ve veri tüketen kodun çok daha temiz ve basit olduğunu göreceksiniz.

Tek dişli ile ilgili olarak, redisin hız ve atomisite için tasarlandığını düşünün. Bir db'deki verileri değiştiren eylemlerin başka bir db'de beklemesine gerek yoktur, ancak bu eylem döküm dosyasına kaydediliyorsa veya köle işlemlerini gerçekleştiriyorsa ne olur? Bu noktada eşzamanlılık programlama yabani otlarına girmeye başlarsınız.

Birden çok örnek kullanarak, çoklu iş parçacığı karmaşıklığını daha basit bir ileti geçirme stil sistemine dönüştürürsünüz.


57
Birden çok veritabanı kullanmaktan vazgeçildi mi? Lütfen bu ifade için bir referans verebilir misiniz? Redis Kümesi'nde birden çok veritabanının desteklenmediğinin farkındayım, ancak karmaşık çok tuşlu komutların ikisi de yok ve kullanımdan kaldırılmadı.
ostergaard

27
Redis 'sahibinden' (Google Code'a göre ) bazı "güçlü kanıtlar " ... geçmişte böyle olacağını belirtsem bile veritabanlarının kullanımdan kaldırılmayacağına dair. "
Kenny Evitt

3
Redis-cluster üzerinde birden fazla redis db kullanamazsınız. Bunun dışında, birden fazla veritabanı hala bir şey olacak.
coredump

26
Kullanımdan kaldırılan ifade için -1. Birden çok veritabanı engellenebilir ve yeniden dağıtım kümesinde desteklenmeyebilir, ancak kullanımdan kaldırılamazlar.
AgDude

1
@ the-real-bill "Anahtar dizini nasıl oluşturabilirsiniz"?
Kees de Kooter

57

Salvatore Sanfilippo (Redis'in yaratıcısı) bile Redis'te birden çok DB kullanmanın kötü bir fikir olduğunu düşünüyor. Yorumuna buradan bakın:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

Bunun nasıl yararlı olabileceğini anlıyorum, ancak ne yazık ki Redis çoklu veritabanı hatalarını Redis tasarımındaki en kötü kararım olarak görüyorum ... herhangi bir gerçek kazanç olmadan, içleri çok daha karmaşık hale getiriyor. Gerçek şu ki, veritabanları, anahtarların ve sanal makinelerin aktif olarak sona ermesi gibi bir dizi nedenden dolayı iyi ölçeklenmemektedir. DB seçimi bir dize ile gerçekleştirilebiliyorsa, bu özelliğin ölçeklenebilir bir O (1) sözlük katmanı olarak kullanıldığını görebilirim, bunun yerine değildir.

DB numaraları ile, birkaç DB varsayılan olarak, biz bu özelliğin ne olduğunu ve bence nasıl kullanılabilir iletişim daha iyi. Umarım bir noktada birden fazla DB desteğini bırakabiliriz, ancak çalışmaları için bu özelliğe güvenen bir dizi insan olduğu için muhtemelen çok geç olduğunu düşünüyorum.


4
Bekle, yani DB seçimi kullanmak sadece bir önek kullanmaktan daha mı az verimli? Bu cümlenin anlamı bu mu (birisi lütfen açıklığa kavuşturabilir mi)? "DB seçimi bir dize ile gerçekleştirilebiliyorsa, bu özelliğin ölçeklenebilir bir O (1) sözlük katmanı olarak kullanıldığını görebilirim, bunun yerine değil."
dvtan

8
  1. Tek bir örnek üzerinde birden fazla veritabanına sahip olmanın hiçbir faydasını gerçekten bilmiyorum. Birden fazla hizmetin aynı veritabanı sunucu (lar) ını kullanması yararlı olur, bu nedenle önemli çakışmalardan kaçınabilirsiniz.

  2. KEYSO (n) ve bu iyi ölçeklenmediğinden , komut kullanarak etrafında inşa tavsiye etmem . Başka bir şekilde başarabilmeniz için ne kullanıyorsunuz? Belki gibi işlevler KEYShayati önem taşıyorsa, redis sizin için en iyi eşleşme değildir .

  3. Sanırım tek bir iş parçacıklı sunucunun SSS'lerinin avantajlarından bahsettiklerini, ancak asıl şey basitlik - herhangi bir gerçekte eşzamanlılık ile uğraşmanıza gerek yok. Her eylem engelleniyor, bu nedenle iki şey aynı anda veritabanını değiştiremez. İdeal olarak, her sunucunun çekirdeği başına bir (veya daha fazla) örneğiniz olur ve anahtarları aralarında bölmek için tutarlı bir karma algoritması (veya proxy) kullanırsınız. Tabii ki, bazı işlevleri kaybedeceksiniz - borular sadece aynı sunucudaki şeyler için çalışacak, türler zorlaşacaktır vb.


2'ye yanıt olarak: Yalnızca tüm tuşlara ihtiyacım olduğunda keys komutunu kullanıyorum. Bunu hgetall ile aynı şekilde kullanıyorum. Her ikisi de O (n) 'dir. Bazı regex için büyük bir anahtar kümesi aramak gerekiyorsa tuşlar kötü, ama bazı db tüm tuşlar üzerinde biraz işlem yapmanız gerekiyorsa mükemmel bir şekilde iyi. 3'e yanıt olarak: Bir veritabanında tek diş açmanın faydalarını anlıyorum. Bir veritabanındaki bir eylemin başka bir veritabanındaki AFAIK eylemini hiçbir zaman engellemesi gerekmediği için birçok veritabanında anlamıyorum.
Eli

3

E-posta adreslerinin bir kara listesini uygulamak için redis kullanıyorum ve farklı kara liste düzeyleri için farklı TTL değerleri var, bu yüzden aynı örnekte farklı DB'lere sahip olmak bana çok yardımcı oluyor.


1
Şimdi aynı sorunla karşı karşıyayız - verilerimizin farklı bölümleri için farklı LRU politikası tanımlamak istiyoruz. lütfen bunu nasıl uyguladığınızı paylaşabilir misiniz?
user2717436

@ user2717436 Yaptığım şeyin sizinkiyle ilgili olup olmadığından emin değilim, ancak farklı kümeler olarak farklı veritabanları kullanıyorum, bunları eklediğimde her zaman tuşların TTL'sini ayarlıyorum. redis.get (1) üzerinde kara liste A olduğu gibi ve orada bir anahtar ayarladığımda, süreyi 5000 olarak ayarladım. ve redis.get (2) üzerinde B kara listesi var ve orada bir anahtar ayarladığımda, zaman
aşımını

2

Redis veritabanları, yeni sürümün farklı varlıklar ile çalışılmasını gerektiren uygulamanın yeni bir sürümünü dağıtmanın nadir durumlarda kullanılabilir.


1

Tek bir örnekte birden çok veritabanı kullanmak aşağıdaki senaryoda yararlı olabilir:

Gerçek zamanlı veriler kullanılarak üretim, geliştirme veya test için aynı veritabanının farklı kopyaları kullanılabilir. İnsanlar aynı amaca ulaşmak için bir yeniden oluşturma örneğini klonlamak için çoğaltmayı kullanabilirler. Bununla birlikte, mevcut yaklaşım, mevcut çalışan programların istenen moda geçmek için doğru veritabanını seçmesi için daha kolaydır.


1

Bu sorunun yaşında olduğunu biliyorum, ancak birden çok veritabanının yararlı olmasının başka bir nedeni var.

En sevdiğiniz bulut sağlayıcısından bir "bulut Redis" kullanırsanız, muhtemelen minimum bellek boyutuna sahip olursunuz ve ayırdığınız şeyin ücretini ödersiniz. Bununla birlikte, veri kümeniz bundan daha küçükse, ayırmayı biraz israf edersiniz ve böylece biraz para israf edersiniz.

Veritabanlarını kullanarak, aynı Redis bulut örneğini (örneğin) geliştirici, UAT ve üretim veya uygulamanızın birden çok örneği veya başka bir şey için hizmet sağlamak için kullanabilirsiniz; etkili.

Baktığım bir kullanım durumunda, her biri 200-300K kullanan bir uygulama örneği var, ancak bulut sağlayıcımdaki minimum ayırma 1M. 10 örneği tek bir Redis üzerinde herhangi bir sınırlama olmadan gerçekten birleştirebiliriz ve bu nedenle Redis barındırma maliyetinin yaklaşık% 90'ından tasarruf edebiliriz. Bu yaklaşımla ilgili sınırlamalar ve sorunlar olduğunu takdir ediyorum, ancak bahsetmeye değer olduğunu düşündüm.

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.