Redis zaten yığının bir parçasıysa Memcached neden hala Redis ile birlikte kullanılıyor?


85

Redis, Memcached'in sağladığı her şeyi (LRU önbelleği, öğe son kullanma tarihi ve şu anda beta sürümünde olan 3.x + sürümünde kümeleme) veya twemproxy gibi araçlarla yapabilir. Performans da benzer. Dahası, Redis, sunucunun yeniden başlatılması durumunda önbellek ısıtması yapmanız gerekmediğinden kalıcılık ekler.

Redis ve Memcache'yi karşılaştıran bazı eski yanıtlara referanslar, bunlardan bazıları Memcache'nin yerine Redis'i tercih eder (yığın içinde zaten mevcutsa):

Buna rağmen Instagram, Pinterest, Twitter vb. Gibi büyük web ölçekli şirketlerin yığınlarını incelerken, birincil önbelleğe alma için Redis kullanmadan hem Memcached hem de Redis'i farklı amaçlarla kullandıklarını gördüm. Birincil önbellek hala Memcached'tir ve Redis, mantıksal önbelleğe alma tabanlı veri yapıları için kullanılır.

2014 itibariyle, memcached'in yapabildiği her şeyi yapabilen bir Redis bileşeniniz zaten varken, neden yığınıza ek bileşen olarak eklenecek acıya hala değer? Mimarları / mühendisleri halihazırda var olan Redis'ten ayrı olarak memcached'i dahil etmeye yönelten avantajlı noktalar nelerdir?

Güncelleme :

Platformlarımız için Memcached'i tamamen kaldırdık ve redis'i mantıksal önbelleğe alma gereksinimlerinin yanı sıra düz kullanıyoruz. Yüksek performanslı, esnek ve güvenilir.

Bazı örnek senaryolar:

  • Önbelleğe alınan tüm anahtarları belirli bir modele göre listelemek ve değerlerini okumak veya silmek. Redis'te çok kolay, memcached'de (kolayca) yapılamaz.
  • Bir yükün 1 MB'den fazla depolanması, redis ile yapılması kolaydır, memcached'de kendi başına performans yan etkileri olan plaka boyutu ayarlamaları gerektirir.
  • Mevcut önbellek içeriğinin kolay anlık görüntüleri
  • Redis kümesi, dil sürücüleriyle birlikte üretime hazırdır, dolayısıyla kümelenmiş dağıtım da kolaydır.

Yanıtlar:


122

Bugün Redis üzerinden memcached için bir kullanım örneği olarak görmemin ana nedeni, düz HTML parçalarını önbelleğe alma (veya benzer uygulamalar) ile elde edebileceğiniz üstün bellek verimliliğidir . Nesnelerinizin farklı alanlarını farklı memcached anahtarlarında saklamanız gerekiyorsa, Redis hash'leri bellek açısından daha verimli olacaktır, ancak çok sayıda anahtar -> basit_dize çiftiniz olduğunda, memcached size başına daha fazla öğe verebilmelidir. megabayt.

Memcached hakkında iyi noktalar olan diğer şeyler:

  • Çok basit bir kod parçası, bu yüzden sadece sağladığı işlevselliğe ihtiyacınız varsa makul bir alternatif sanırım ama bunu üretimde hiç kullanmadım.
  • Çok iş parçacıklıdır, bu nedenle tek kutulu bir kurulumda ölçeklendirmeniz gerekiyorsa, bu iyi bir şeydir ve yalnızca bir örnekle konuşmanız gerekir.

Redis'in bir önbellek olarak insanlar akıllı önbelleğe almaya doğru ilerledikçe veya Redis veri yapıları aracılığıyla önbelleğe alınan verilerin yapısını korumaya çalıştıklarında giderek daha mantıklı olduğuna inanıyorum.

Redis LRU ve memcached LRU arasında karşılaştırma.

Hem memcached hem de Redis gerçek LRU tahliyesi gerçekleştirmez, ancak bunun sadece bir tahminidir.

Memcache tahliyesi, boyut başına sınıftır ve döşeme ayırıcısının uygulama ayrıntılarına bağlıdır. Örneğin, belirli bir boyut sınıfına uyan bir öğe eklemek istiyorsanız, memcached o sınıftaki süresi dolmuş / yakın zamanda kullanılmamış öğeleri kaldırmaya çalışacak, bunun yerine nesnenin ne olduğunu anlamak için genel bir girişimde bulunacaktır. en iyi aday olan boyut.

Redis bunun yerine maxmemorysınıra ulaşıldığında tahliye için aday olarak iyi bir nesne seçmeye çalışır , boyut sınıfından bağımsız olarak tüm nesnelere bakar, ancak yalnızca yaklaşık olarak iyi bir nesne sağlayabilir , daha büyük boşta en iyi nesneyi sağlamaz. zaman.

Redis'in bunu yapmasının yolu, birkaç nesneyi örnekleyerek, en uzun süre boşta (erişilemeyen) olanı seçmektir. Redis 3.0'dan (şu anda beta sürümünde) bu yana algoritma geliştirildi ve aynı zamanda tahliyeler boyunca iyi aday havuzları aldı, bu nedenle yaklaşım iyileştirildi. In Redis belgelerine nasıl çalıştığını hakkında ayrıntılar içeren bir açıklama ve grafikler bulabilirsiniz .

Memcached'in bellek ayak izi neden basit dizge -> dizgi eşlemeleri için Redis'den daha iyidir.

Redis daha karmaşık bir yazılım parçasıdır, bu nedenle Redis'teki değerler, yüksek seviyeli bir programlama dilindeki nesnelere daha benzer bir şekilde depolanır: bellek yönetimi için ilişkili tür, kodlama, referans sayımı vardır. Bu, Redis'in iç yapısını iyi ve yönetilebilir kılar, ancak memcached ile karşılaştırıldığında yalnızca dizelerle ilgilenen bir ek yüke sahiptir.

Redis bellek açısından daha verimli olmaya başladığında

Redis, küçük toplu veri türlerini özel bir bellek tasarrufu yöntemiyle depolayabilir. Örneğin, bir nesneyi temsil eden küçük bir Redis Hash, dahili olarak bir hash tablosu ile değil, ikili benzersiz bir blob olarak depolanır. Dolayısıyla, bir karma olarak nesne başına birden çok alan ayarlamak, N ayrılmış anahtarı memcached içine depolamaktan daha etkilidir.

Aslında, bir nesneyi memcached içine tek bir JSON (veya ikili kodlanmış) blob olarak depolayabilirsiniz, ancak Redis'in aksine, bu bağımsız alanları getirmenize veya güncellemenize izin vermez.

Akıllı önbelleğe alma bağlamında Redis'in avantajı.

Redis veri yapıları nedeniyle, önbellek geçersiz kılındığında nesneleri daha sonra DB'den yeniden oluşturmak için memcached ile kullanılan olağan desen, Redis'i kullanmanın ilkel bir yoludur.

Örneğin, sitenin "En Yeni" bölümünü doldurmak için Hacker News'de yayınlanan en son N haberi önbelleğe almanız gerektiğini düşünün. Redis ile yaptığınız şey, eklenen en yeni haberlerin bulunduğu bir listeyi (M öğeyle sınırlı) almaktır. Verileriniz için başka bir mağaza ve önbellek olarak Redis kullanıyorsanız, yeni bir öğe gönderildiğinde her iki görünümü (Redis ve DB) doldurmanız gerekir . Önbellek geçersiz kılma yoktur.

Bununla birlikte, uygulama her zaman mantığa sahip olabilir, böylece Redis listesinin boş olduğu belirlenirse, örneğin bir başlangıçtan sonra, ilk görünüm DB'den yeniden oluşturulabilir.

Akıllı önbelleğe alma kullanarak, Redis ile önbelleğe alma işlemini memcached'e kıyasla daha verimli bir şekilde gerçekleştirmek mümkündür, ancak tüm sorunlar bu model için uygun değildir. Örneğin HTML parçalarını önbelleğe alma bu teknikten yararlanamayabilir.


Yaratıcı Antirez'e teşekkürler. Ama ** neden düz dizeler için Redis bellek ayak izi memcached'inkinden daha fazla? ** Sıkıştırma bir faktör mü? Veya düz bir dizeyi saklamak için bir SET kullanıldığında Redis başka bazı ekstra verileri depolar? Bu bilgiyi cevaba dahil etmeniz harika olur.
DhruvPathak

3
Cevabı iyileştirmeye çalıştım. Geri bildirimler için teşekkürler.
antirez

3
Yukarıda bahsedilen "zeka" nın başka bir yönü veya işlemler ve / veya komut dosyaları aracılığıyla Redis'in veri türleri ve sunucu tarafı mantığından yararlanmanın bir başka yönü, hem uygulama karmaşıklığından hem de ağdan tasarruf etmenizdir ( @antirez tarafından antirez'de tartışıldığı gibi . com / news / 73 ve Yiftach, redislabs.com/blog/the-proven-redis-performance adresinde ).
Itamar Haber

1
Antirez cevap için teşekkürler. Başka bir neden de memcached'in biraz daha hızlı olması olabilir. Ayrıca eski bir yazılım parçasıdır ve birçok çerçeve onu varsayılan olarak destekler
Nick

3
Mükemmel cevap, Redis'in babasının topluma ne kadar bağlı olduğunu sevmelisin.
Mahn

13

Alışkanlıkları kırmak zordur :)

Cidden, Memcached'in neden hala kullanıldığını anladığım kadarıyla iki ana neden var:

  1. Eski - Memcached'i destekleyen uygulamaların yanı sıra Memcached'e aşina olan geliştiriciler var. Bu aynı zamanda olgun ve iyi test edilmiş bir teknoloji olduğu anlamına gelir.
  2. Ölçeklendirme - standart Memcached yatay olarak kolayca ölçeklenebilirken, Redis (yakında piyasaya sürülecek v3'e kadar ve hariç) bu amaçla daha fazla çalışma gerektirir (yani parçalama).

Ancak:

  1. Yeniden. miras - Redis'in sağlamlığı (veri yapıları, komutlar, kalıcılığı ...) göz önüne alındığında, aktif olarak geliştiriliyor ve akla gelebilecek her dilde istemciler - yeni uygulamalar genellikle onunla geliştirilir.
  2. Yeniden ölçeklendirme - Yaklaşan v3'ün yanı sıra, ölçeklemeyi çok daha kolay hale getirebilecek çözümler var. Örneğin Redis Cloud , veri kaybı veya hizmet kesintisi olmadan sorunsuz ölçeklendirme sunar. Redis'i ölçeklendirmeye / parçalamaya yönelik bir başka popüler yaklaşım da twemproxy'dir .

1
Sadece bir not: Twitter'daki mevcut geliştirici tarafından onaylandığı gibi, Memcached hala aktif olarak geliştirilmekte / sürdürülmektedir. Sanırım genellikle yeni şeyler eklememesi, projenin ulaştığı olgunluktan ve yeni şeyler ekleme isteksizliğinden kaynaklanıyor, bu nedenle yeni gelişmeler optimizasyonlara / düzeltmelere odaklanıyor.
antirez

1
Memcached hala hayatta ve tekmeliyor - cevabımı düzenledi / ty antirez & dormando
Itamar Haber

1
Tutarlı hashing, saf bir önbellek senaryosu için Redis parçalamasından daha zarif bir başarısızlık için hala daha sağlam bir modeldir. Düğümler düştükçe önbellek anahtarları otomatik olarak diğer sunuculara taşınır. Tek bir sunucunuz olduğu sürece, herhangi bir karma grup için ana ve köleyi kaybederseniz kümenizin başarısız olduğu redis yerine önbelleğiniz çalışmaya devam eder.
Usman Ismail

1
RedisLabs mükemmel. Userify Cloud'un arkasındaki önemli bir teknolojidir.
fatal_error

1
Ayrıca çok iş parçacıklı ve olay döngüsü temelli olmayan herhangi bir uygulamadan da son derece şüpheliyim. ... Tamam, şimdi nerede performans savunucuları var, akşam yemeğini düzenledim. Artık redis bunu yapabilirdi ve sistem açısından çok daha fazla redis yanlısı olurdum. Ancak bu noktada, geliştirme grubu alışılmadık şekilde önbelleğe alma konusunda yetenekli olmadığı sürece memcached basit ve daha verimli bir uygulamadır .... özellikler ASLA ücretsiz değildir, savunucuların size olduklarını veya maliyetlerinizin önemsiz olduğunu söylemesine izin vermeyin.
JM Becker
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.