Redis ve Memcache mi yoksa sadece Redis mi?


85

Basit Rails.cachearayüz aracılığıyla Rails 3 uygulamamda bazı önbelleğe alma işlemleri için memcached kullanıyorum ve şimdi redis ve resque ile bazı arka plan işlerini yapmak istiyorum.

İkisini de kullanmayı garanti edecek kadar farklı olduklarını düşünüyorum. Heroku'da hem memcached hem de redis kullanmak için ayrı ücretler vardır. İkisini birden kullanmak mantıklı mı yoksa yalnızca redis kullanmaya mı geçmeliyim?

Önbelleğe alma için memcached kullanmayı seviyorum çünkü en son kullanılan anahtarlar otomatik olarak önbellekten dışarı atılıyor ve kalıcı olmak için önbellek verilerine ihtiyacım yok. Redis benim için çoğunlukla yeni, ancak varsayılan olarak kalıcı olduğunu ve anahtarların önbellekten otomatik olarak sona ermediğini anlıyorum.

DÜZENLEME: Sorumla daha net olmak istedim. İkisi yerine yalnızca Redis kullanmanın mümkün olduğunu biliyorum. Sanırım bunu yapmanın belirli bir dezavantajı olup olmadığını bilmek istiyorum. Hem uygulama hem de altyapı düşünüldüğünde, Redis'i kullanmamam için herhangi bir neden var mı? (Yani, basit önbelleğe alma için memcached daha hızlı mı?) Her iki şekilde de kesin bir şey bulamadım.


5
Bunu düşünen başkaları için: Redis'i bir önbellek deposu olarak kullanmanıza izin veren raylar için bir reis-store eklentisi var.
markquezada

Yanıtlar:


49

Zaten yaptığınız önbelleğe alma için memcached'den redis'e geçişin yeterince kolay olduğunu varsayarsak, redis'i yalnızca işleri basit tutmak için kullanırdım.

Redis'te kalıcılık isteğe bağlıdır, bu nedenle istediğiniz buysa memcached gibi kullanabilirsiniz. Önbelleğinizi kalıcı hale getirmenin, yeniden başlatmanın ardından çok sayıda önbellek kaybını önlemek için yararlı olduğunu bile görebilirsiniz. Son kullanma tarihi de mevcuttur - algoritma memcached'den biraz farklıdır, ancak çoğu amaç için yeterli değildir - ayrıntılar için bkz. Http://redis.io/commands/expire .


1
Cevap ve ilgili belgeler için teşekkürler. Ne aradığımı daha net hale getirmek için sorumu biraz düzenledim. Yeniden başlatmadan sonra önbellek kalıcılığını düşünmedim ... bu güzel bir özellik. (Heroku ile gitmek için redis'i kullanacağımı düşünmenin ne kadar yararlı olduğundan emin olmasam da)
markquezada

1
Bazı öğeleri geçici (parça önbelleğe alma) ve bazı öğeleri yeniden düzenlemede kalıcı tutmak istiyorsanız, iki ayrı redis örneği oluşturmanız gerekir mi?
Brian Armstrong

1
Redis'i hem iş kuyrukları hem de önbellek için kullanırken, özellikle @ BrianArmstrong'un belirttiği nedenlerden dolayı farklı konfigürasyonlarla çalıştırıyoruz. Önbellek geçicidir, bu yüzden onu hızlı olacak şekilde yapılandırıyoruz, ancak bellekteki bir şeyleri kaybetmek ve LRU'yu bırakmak sorun değil. Kuyruk için, gerçekten işleri kaybetmek istemiyoruz, bu yüzden kurtarılabilir olması için ısrarla yapılandırıyoruz.
jwadsack

@jwadsack bu yapılandırmayı nasıl uyguladığınızı gösterdiğiniz bir gönderi var mı?
Marklar

1
@Marklar İyi fikir. Şimdi yapıyorum: ballardhack.wordpress.com/2015/09/30/…
jwadsack

44

Ben yazarı olduğum REDIS mağaza , sadece kullanmak, doğrudan Redis komutları kullanmaya gerek yoktur :expires_inböyle seçeneği:

ActionController::Base.cache_store = :redis_store, :expires_in => 5.minutes

Redis kullanmanın avantajı sağlamlıktır ve benim cevherimle Rack::Cache, Rails.cacheveya için zaten mağazalarınız olmasıdır I18n.


Cevap için teşekkürler Luca. Bir şeyi kalıcı olarak saklamanız gerektiğinde, geçersiz kılabileceğinizi varsayıyorum: expires_in? Ben soru hem memcached tipi işlevini kullanarak gerçekten olduğunu tahmin ve yan yana kalıcı deposu olarak REDIS kullanarak.
markquezada

3
Aynı NoSQL segmentinde oldukları için hem memcached hem de redis'e sahip olmanın mantıklı olduğunu düşünmüyorum: ikisi de ak / v deposu. Redis PROS: 1. memcached'den daha hızlı 2. daha güçlü komutlar 3. önbellek ısınmasına gerek yok 4. diğer problemleri çözmek için kullanışlıdır (örn. Resque ile kuyruklar) CONS: 1. harici bir gem'e ihtiyacınız var 2. yeniden başlattıktan sonra, sunucu Ekleme dosyasından veri okurken komutları kabul etmez Memcached PROS: Rails CONS: 1. Redis 2. önbellek ısınmasından daha yavaş.
Luca Guidi

3
@LucaGuidi Şu anda Rails önbelleğim için RedisStore kullanıyorum. Hem Redis URL'sini hem de varsayılanı nasıl ayarlayacağımı çözemiyorum :expires_in. Yardım edebilir misin?
Chris Vincent

Benim gibi, :expires_inredis_store kullanarak ayarlamayla karşılaşıyorsanız, stackoverflow.com/questions/20907247/… '
Anirudhan J

19

Hem Memcached hem de Redis kullanan birkaç büyük raylı site gördüm. Memcached, bellekte sıcak tutulması hoş olan ancak gerektiğinde kaybolabilen / yeniden oluşturulabilen geçici şeyler için ve kalıcı depolama için Redis için kullanılır. Her ikisi de ağır işlemleri okumak / yazmak için ana DB'den bir yük almak için kullanılır.

Daha fazla detay:

Memcached: sayfa / parça / yanıt önbelleğe alma için kullanılır ve Memcached'deki bellek sınırına ulaşmak sorun değil çünkü eski öğelerin süresinin dolması için LRU (en son kullanılan) ve sıklıkla erişilen anahtarları bellekte sıcak tutacak. Memcached'teki herhangi bir şeyin gerekirse DB'den yeniden oluşturulabilmesi önemlidir (bu sizin tek kopyanız değildir). Ancak içine bir şeyler atmaya devam edebilirsiniz ve Memcached hangilerinin en sık kullanıldığını anlayacak ve bunları hafızada tutacaktır. Memcached'den bir şeyleri kaldırma konusunda endişelenmenize gerek yok.

redis: Bunu, kaybetmek istemeyeceğiniz ve belleğe sığacak kadar küçük veriler için kullanırsınız. Bu genellikle yeniden sıralama / sidekiq işleri, hız sınırlama sayaçlarını, test sonuçlarını veya kaybetmek / yeniden oluşturmak istemediğiniz her şeyi içerir. Buradaki bellek sınırını aşmak istemezsiniz, bu nedenle daha sonra neyi saklayıp temizlediğiniz konusunda biraz daha dikkatli olmalısınız.

Redis, bellek sınırını aştığında performans sorunları yaşamaya başlar (yanılıyorsam düzeltin). Redis'i Memcached ve LRU'nun süresi dolan şeyler gibi davranacak şekilde yapılandırarak bunu çözmek mümkündür, böylece bellek sınırına asla ulaşmaz. Ancak bunu, yeniden yapılan işler gibi Redis'te tuttuğunuz her şeyle yapmak istemezsiniz. Bu nedenle, insanlar yerine genellikle varsayılanı korur, Rails.cache Memcached'i ( dallitaş kullanarak ) kullanmaya ayarlıdır . Ve sonra, redis işlemlerini yapmak için ayrı bir $ redis = ... global değişken tutarlar.

# in config/application.rb
config.cache_store = :dalli_store  # memcached

# in config/initializers/redis.rb
$redis = $redis = Redis.connect(url: ENV['REDIS_URL'])

Tüm bunları Redis'te yapmanın kolay bir yolu olabilir - belki de biri Memcache'ye benzer bir LRU sabit bellek sınırına sahip ve diğeri kalıcı depolama için olmak üzere iki ayrı Redis örneğine sahip olarak? Bunun kullanıldığını görmedim, ama yapılabilir olacağını tahmin ediyorum.


15

Bu konudaki cevabıma bakmayı düşünürdüm:

Raylar ve önbelleğe alma, memcache ve redis arasında geçiş yapmak kolay mı?

Esasen, deneyimlerime dayanarak, onları ayrı tutmayı savunurdum: önbelleğe alma için memcached ve veri yapıları ve daha kalıcı depolama için yeniden düzenleme


Başlangıçta bunları sorumun orijinal cevabına göre pekiştirmeyi planlamış olsam da, o zamandan beri temelde aynı sonuca vardım. Memcache'i temel önbelleğe alma ve yeniden başlatma için yeniden kullanma için kullanıyorum.
markquezada

6

Redis Labs ekibine ( Memcached Cloud ve Redis Cloud eklentilerini sağlayan) Rails önbelleğe alma için hangi ürünü önereceklerini sordum . Genel olarak Redis Cloud'u tavsiye edeceklerini, Memcached Cloud'un esas olarak eski amaçlar için sunulduğunu söylediler ve Memcached Cloud hizmetlerinin aslında Redis Cloud üzerine inşa edildiğine dikkat çektiler.


Brian'ın cevabında belirtildiği gibi hem memcached hem de redis'e gerek yok mu? "insanlar genellikle varsayılan Rails.cache setini memcached kullanmak üzere tutarlar (dalli gem kullanarak). Ve sonra redis işlemlerini yapmak için ayrı bir $ redis = ... global değişken tutarlar."
Marklar

4

Bunları ne için kullandığınızı bilmiyorum, ancak aslında ikisini birden kullanmak size bir performans avantajı sağlayabilir: Memcached, Redis'e göre birden çok çekirdekte çok daha iyi performans gösterir, bu nedenle en önemli verileri Memcached ile önbelleğe almak ve geri kalanını Redis'te tutmak veritabanı olarak yeteneklerinden yararlanarak performansı artırabilir.


1
Bu tamamen doğru değil - redis, birden çok iş parçacığı yerine birden çok örnek kullanıyor, bu nedenle tek çekirdekli bir yeniden işleme örneğini çok çekirdekli memcached örneğiyle karşılaştırmak özellikle alakalı bir test değildir. Ayrıca, her iki sistemin de en hızlı olduğunu gösteren kıyaslamalar mevcut olduğunda, farkın gerçek dünyada önemli olması olası değildir.
Tom Clarkson

Redis'in çoklu işlem yaklaşımı, çok çekirdekli sistemlerde çoklu iş parçacığı içeren memcached'in (varsayılan) yaklaşımından daha iyi ölçeklenir: antirez.com/post/update-on-memcached-redis-benchmark.html
Ludger Sprenker

3
Redis'in bu büyük eksikliği gerçekten çok önemsenmiyor. Yüksek eşzamanlılık arıyorsanız ve çok sayıda çekirdeğiniz varsa, Memcached Redis'in etrafında daireler çizebilir. Parçalama, uygulamanızda tutarlı karma uygulamanız gerektiğinden ve Redis örnekleri arasında mükemmel bir dağıtım elde edemeyeceğiniz için iyi bir çözüm değildir. Örneğin, A parçacığı, uygulamanızın her istekte kullanılan yapılandırmasını önbelleğe alıyorsa, parça A, her istek için isabetli olmayan diğer parçalardan daha fazla istek alır.
ColinM
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.