Redis ile MongoDB


95

Redis ve MongoDB'yi birbirinizle birlikte kullanmaktan ne zaman faydalanacağınıza dair örnek kullanım örnekleri verebilir misiniz?

Yanıtlar:


158

Redis ve MongoDB iyi sonuçlarla birlikte kullanılabilir. MongoDB ve Redis (MySQL ve Sphinx ile birlikte) çalıştırmasıyla tanınan bir şirket Craiglist'tir. Jeremy Zawodny'nin bu sunumuna bakın .

MongoDB, kalıcı, belge odaklı, çeşitli şekillerde indekslenmiş veriler için ilginçtir. Redis, geçici veriler veya gecikmeye duyarlı yarı kalıcı veriler için daha ilginçtir.

Aşağıda, MongoDB'nin yanı sıra Redis'in somut kullanımına ilişkin birkaç örnek verilmiştir.

  • Pre-2.2 MongoDB henüz bir sona erme mekanizmasına sahip değil. Sınırlı koleksiyonlar, gerçek bir TTL uygulamak için gerçekten kullanılamaz. Redis, geçici verilerin saklanmasını kolaylaştıran TTL tabanlı bir sona erme mekanizmasına sahiptir. Örneğin, kullanıcı oturumları genellikle Redis'te depolanırken, kullanıcı verileri MongoDB'de depolanacak ve dizine eklenecektir. MongoDB 2.2'nin toplama seviyesinde (örneğin verileri temizlemek için kullanılacak) düşük doğrulukta bir sona erme mekanizması getirdiğini unutmayın.

  • Redis, uygun bir küme veri türü ve ilişkili işlemlerini (birleşim, kesişim, çoklu kümelerde fark, vb.) Sağlar. MongoDB'nin daha geleneksel indeksleme yeteneklerine ilginç bir katkı olan bu özelliğin üzerine temel bir yönlü arama veya etiketleme motoru uygulamak oldukça kolaydır.

  • Redis, listelerde etkin engelleme pop işlemlerini destekler. Bu, geçici bir dağıtılmış kuyruk sistemi uygulamak için kullanılabilir. MongoDB kullanılabilir imleçleri IMO'dan daha esnektir, çünkü bir arka uç uygulaması bir zaman aşımı ile birkaç kuyruğu dinleyebilir, öğeleri atomik olarak başka bir kuyruğa aktarabilir, vb ... Uygulama biraz kuyruk gerektiriyorsa, kuyruğu Redis'te saklamak mantıklıdır ve kalıcı işlevsel verileri MongoDB'de saklayın.

  • Redis ayrıca bir pub / sub mekanizması sunar. Dağıtılmış bir uygulamada, bir olay yayılma sistemi faydalı olabilir. Kalıcı veriler MongoDB'de tutulurken, bu yine Redis için mükemmel bir kullanım durumudur.

MongoDB ile bir veri modeli tasarlamak Redis'e göre çok daha kolay olduğundan (Redis daha düşük seviyelidir), ana kalıcı veriler için MongoDB'nin esnekliğinden ve Redis tarafından sağlanan ekstra özelliklerden (düşük gecikme süresi) yararlanmak ilginçtir. , öğe süre sonu, kuyruklar, pub / sub, atomik bloklar vb.). Gerçekten de iyi bir kombinasyon.

Lütfen aynı makinede Redis ve MongoDB sunucusu çalıştırmamanız gerektiğini unutmayın. MongoDB belleği değiştirilmek üzere tasarlanmıştır, Redis ise değildir. MongoDB bazı takas etkinliklerini tetiklerse, Redis'in performansı felaket olacaktır. Farklı düğümlerde izole edilmelidirler.


19
MongoDB 2.2 (yeni yayınlandı), ilk noktanıza hitap eden TTL desteğini ekler: docs.mongodb.org/manual/tutorial/expire-data
John Zwinck

Her birinin karşılaştırmalı güçlü yönlerinden bazıları hakkında harika noktalar.
Brian Bulkowski

2
Her birinin karşılaştırmalı güçlü yönlerinden bazıları hakkında harika noktalar. Redis'in noktalarından biri hafızada ayarlama yapmaktır. Kümeleme ve güvenilirliğe odaklanan AerospikeDB gibi düşük gecikmeye odaklanan ve ayrıca gerçek zamanlı kullanım durumu Redis'in kolayca idare edebileceğinin ötesine geçtiğinde kullanılabilen SSD depolamaya odaklanan başka projeler de var.
Brian Bulkowski

Jeremy Zawodny'nin konuşmasının videosu: youtube.com/watch?v=qFcB1Xw1WSk
Frankenmint

25

Açıkçası, bundan çok daha fazla fark var , ancak son derece yüksek bir genel bakış için:

Kullanım durumları için:

  • Redis, genellikle dağıtılmış hesaplama için bir önbellek katmanı veya paylaşılan beyaz tahta olarak kullanılır.
  • MongoDB, genellikle geleneksel SQL veritabanları için bir takas yerine kullanılır.

Teknik olarak:

  • Redis, disk kalıcılığına sahip bir bellek içi db'dir (tüm veritabanının RAM'e sığması gerekir).
  • MongoDB, yalnızca dizinler için yeterli RAM'e ihtiyaç duyan disk destekli bir db'dir.

Bir miktar örtüşme vardır, ancak ikisinin de kullanılması son derece yaygındır. İşte nedeni:

  • MongoDB daha fazla veriyi daha ucuza depolayabilir.
  • Redis, tüm veri kümesi için daha hızlıdır.
  • MongoDB'nin kültürü "hepsini depolayın, erişim modellerini daha sonra öğrenin"
  • Redis'in kültürü, "verilere nasıl erişeceğinizi ve sonra nasıl depolayacağınızı dikkatlice düşünün"
  • Her ikisi de, çoğu birlikte kullanılan, kendilerine bağlı açık kaynak araçlara sahiptir.

Redis, geleneksel bir veri deposunun yerine kullanılabilir, ancak çoğunlukla Mongo, Postgresql, MySQL vb. Gibi başka bir normal "uzun" veri deposu ile kullanılır .


0

Redis, bir önbellek sunucusu olarak MongoDB ile mükemmel bir şekilde çalışır. İşte olan şey.

Firavun faresi bir önbellek sorgusu yayınladığında, önce önbellek sunucusuna gidecektir.

Önbellek sunucusu, bu sorgunun daha önce verilip verilmediğini kontrol edecektir.

Aksi takdirde, önbellek sunucusu sorguyu alacak, mongodb'a gönderecek ve Mongo sorguyu yürütecek.

Daha sonra bu sorgunun sonucunu alacağız, daha sonra önbellek sunucusuna geri dönecek, önbellek sunucusu sorgunun sonucunu kendi üzerinde depolayacaktır.

Bu sorguyu her çalıştırdığımda, bu yanıtı aldığımı ve bu nedenle, gönderilen sorgular ile bu sorgulardan geri gelen yanıtlar arasında bir kayıt tutacağını söyleyecektir.

Önbellek sunucusu yanıtı alacak ve firavun faresine geri gönderecek, firavun faresi bunu ifade edecek ve sonunda uygulamanın içinde bitecek.

Her seferinde aynı tam sorgunun tekrar yayınlandığı her seferinde, mongoose aynı sorguyu önbellek sunucusuna gönderecek, ancak önbellek sunucusu bu sorgunun daha önce yapıldığını görürse, sorguyu mongodb'a göndermeyecek, bunun yerine yanıtı alacaktır. en son aldığı sorgu ve hemen firavun faresine geri gönder. Burada indeks yok, tam tablo taraması yok, hiçbir şey yok.

Bu sorgunun yürütüldüğünü söylemek için basit bir arama yapıyoruz? Evet? Tamam, isteği al ve hemen geri gönder ve mongo'ya hiçbir şey gönderme.

Firavun faresi sunucusuna, önbellek sunucusuna (Redis) ve Mongodb'a sahibiz.

Önbellek sunucusunda, anahtar değer türünde veri deposu olan bir veri deposu olabilir; burada tüm anahtarlar, daha önce verilmiş bir tür sorgu ve değerin bu sorgunun sonucudur.

Yani belki _id tarafından yazılmış bir grup blog gönderisine bakıyoruz.

Belki de buradaki anahtarlar, daha önce aradığımız kayıtların _ididir.

Öyleyse firavun faresinin _id 123 ile bir blog gönderisini bulmaya çalıştığı, sorgu önbellek sunucusuna aktığı, önbellek sunucusunun _id arayan herhangi bir sorgu için bir sonuç olup olmadığını kontrol ettiği yeni bir sorgu yayınladığını düşünelim. 123.

Önbellek sunucusunda yoksa, bu sorgu alınır ve mongodb örneğine gönderilir. Mongodb sorguyu yürütecek, bir yanıt alacak ve geri gönderecek.

Bu sonuç, o sonucu alan ve hemen mongoose'a geri gönderen önbellek sunucusuna geri gönderilir, böylece olabildiğince hızlı bir yanıt alırız.

Bundan hemen sonra, önbellek sunucusu aynı zamanda verilen sorguyu da alır ve bunu yayınlanan sorgu koleksiyonuna ekler ve sorgunun sonucunu alır ve doğrudan sorguya karşı depolar.

Bu yüzden, gelecekte aynı sorguyu tekrar yayınlayacağımızı, önbellek sunucusuna çarptığını, sahip olduğu tüm anahtarlara baktığını ve şu blog yayınını buldum, mongo'ya ulaşmadığını, sadece sorgunun sonucu ve doğrudan firavun faresine gönderir.

Karmaşık sorgu mantığı yapmıyoruz, endeks yok, buna benzer bir şey yapmıyoruz. Mümkün olduğu kadar hızlı. Basit bir anahtar değer aramasıdır.

Bu, önbellek sunucusunun (Redis) MongoDB ile nasıl çalıştığına dair bir genel bakış.

Şimdi başka endişeler var. Verileri sonsuza kadar önbelleğe mi alıyoruz? Kayıtları nasıl güncelleriz?

Verileri her zaman önbellekte saklamak ve önbellekten okumak istemiyoruz.

Önbellek sunucusu, herhangi bir yazma eylemi için kullanılmaz. Önbellek katmanı yalnızca verileri okumak için kullanılır. Herhangi bir veri yazarsak, yazma her zaman mongodb örneğine gider ve önbellek sunucusunda depolanan ve Mongo'da yeni güncellediğimiz kayıtla ilgili her türlü veriyi her yazışımızda temizlediğimizden emin olmalıyız.

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.