Memcached mı Redis mi?


1466

Önbelleğe almak için Redis sunucusuyla bir Ruby web uygulaması kullanıyoruz . Bunun yerine Memcached'ı test etmenin bir anlamı var mı ?

Bize daha iyi performans verecek olan nedir? Redis ve Memcached arasında artıları veya eksileri var mı?

Dikkate alınması gereken noktalar:

  • Okuma / yazma hızı.
  • Hafıza kullanımı.
  • Disk G / Ç dökümü.
  • Ölçekleme.

38
Aşağıdaki yorumlara ek olarak başka bir analiz: Google Eğilimler: redis vs. memcached
MarkHu

3
Yanıt gerektirmeyen bir yorum: bu iki sistem için bulut tabanlı hizmetlere (örneğin heroku eklentileri) bakıyorsanız, Memcached hizmetleri bazen MB başına biraz daha ucuzdur.
Ben Roberts

Yanıtlar:


2104

Özet (TL; DR)

Güncelleme: 3 Haziran 2017

Redis, memcached'den daha güçlü, daha popüler ve daha iyi desteklenir. Memcached, Redis'in yapabileceği şeylerin sadece küçük bir kısmını yapabilir. Redis, özelliklerinin çakıştığı yerlerde bile daha iyidir.

Yeni herhangi bir şey için Redis kullanın.

Memcached vs Redis: Doğrudan Karşılaştırma

Her iki araç da önbellek olarak yararlı olan güçlü, hızlı, bellek içi veri depolarıdır. Her ikisi de veritabanı sonuçlarını, HTML parçalarını veya oluşturulması pahalı olabilecek herhangi bir şeyi önbelleğe alarak uygulamanızı hızlandırmanıza yardımcı olabilir.

Dikkate alınması gereken noktalar

Aynı şey için kullanıldığında, orijinal sorunun "Dikkate Alınması Gereken Noktalar" ı kullanarak nasıl karşılaştırdıklarını aşağıda bulabilirsiniz:

  • Okuma / yazma hızı : Her ikisi de son derece hızlıdır. Karşılaştırma ölçütleri iş yüküne, sürümlere ve diğer birçok faktöre göre değişir, ancak genellikle redislerin memcached kadar hızlı veya neredeyse hızlı olduğunu gösterir. Redis'i tavsiye ederim, ancak memcached yavaş olduğu için değil. Değil.
  • Bellek kullanımı : Redis daha iyidir.
    • memcached: Önbellek boyutunu belirtirsiniz ve öğeleri ekledikçe arka plan programı bu boyuttan biraz daha fazla büyür. Memcached'ı yeniden başlatmadan kısa bir süre sonra o alanın herhangi birini geri almanın hiçbir yolu yoktur. Tüm anahtarlarınızın süresi doldu, veritabanını temizleyebilirsiniz ve yine de yapılandırdığınız RAM yığınını kullanır.
    • redis: Maksimum boyut ayarlamak size kalmış. Redis asla gerekenden fazlasını kullanmayacak ve artık kullanmadığı belleği geri verecektir.
    • Her ikisine de 100.000 ~ 2KB dizeleri (~ 200MB) rastgele cümleler sakladım. Memcached RAM kullanımı ~ 225MB'a çıktı. Redis RAM kullanımı ~ 228MB'a çıktı. Her ikisini de yıkadıktan sonra, redis ~ 29MB'ye düştü ve memcached ~ 225MB'da kaldı. Verileri saklama biçiminde benzer şekilde etkilidirler, ancak yalnızca biri veriyi geri kazanma yeteneğine sahiptir.
  • Disk G / Ç dökümü: Bunu varsayılan olarak yaptığı ve yapılandırılabilir kalıcılığı olduğundan yeniden çıkarma için açık bir kazanç. Memcached'in 3. taraf araçları olmadan diske boşaltma mekanizması yoktur.
  • Ölçeklendirme : Her ikisi de, önbellek olarak tek bir örnekten daha fazlasına ihtiyaç duymadan önce tonlarca boşluk sağlar. Redis, memcached yapmazken bunun ötesine geçmenize yardımcı olacak araçlar içerir.

memcached

Memcached basit bir geçici önbellek sunucusudur. Anahtar / değer çiftlerini, değerin 1MB'ye kadar bir dize ile sınırlı olduğu yerlerde saklamanızı sağlar.

Bu konuda iyi, ama hepsi bu kadar. Bu değerlere, genellikle kullanılabilir ağ veya hatta bellek bant genişliğini doyurarak, son derece yüksek hızda anahtarlarıyla erişebilirsiniz.

Memcached'ı yeniden başlattığınızda verileriniz kaybolur. Bu bir önbellek için iyidir. Orada önemli bir şey saklamamalısınız.

Yüksek performansa veya yüksek kullanılabilirliğe ihtiyacınız varsa, üçüncü taraf araçlar, ürünler ve hizmetler mevcuttur.

Redis

Redis, memcached ile aynı işleri yapabilir ve daha iyi yapabilir.

Redis de önbellek görevi görebilir . Anahtar / değer çiftlerini de saklayabilir. Redis'te 512 MB'a kadar bile olabilirler.

Kalıcılığı kapatabilirsiniz ve yeniden başlatma sırasında verilerinizi de mutlu bir şekilde kaybedecektir. Önbelleğinizin yeniden başlatılmasını istiyorsanız, bunu da yapmanızı sağlar. Aslında, bu varsayılan.

Aynı zamanda süper hızlıdır, genellikle ağ veya bellek bant genişliği ile sınırlıdır.

Bir redis / memcached örneği iş yükünüz için yeterli performans yoksa, redis açık seçimdir. Redis, küme desteğini içerir ve sağ "kutuda" yüksek kullanılabilirlik araçları ( redis-sentinel ) ile birlikte gelir . Son birkaç yıldır, redis 3. taraf araç takımında da açık lider olarak ortaya çıktı. Redis Labs, Amazon ve diğerleri gibi şirketler birçok yararlı redis aracı ve hizmeti sunmaktadır. Redis çevresindeki ekosistem çok daha büyük. Büyük ölçekli dağıtımların sayısı artık memcached'lerden daha fazla.

Redis Superset

Redis bir önbellekten daha fazlasıdır. Bir bellek içi veri yapısı sunucusudur. Aşağıda, Redis'in memcached gibi basit bir anahtar / değer önbelleği olmanın ötesinde yapabileceği şeylere hızlı bir genel bakış bulacaksınız. Çoğu REDIS' özelliklerinden yapamaz memcached şeylerdir.

belgeleme

Redis, memcached'den daha iyi belgelenmiştir. Bu öznel olsa da, her zaman daha doğru gibi görünüyor.

redis.io kolay gezinilen fantastik bir kaynaktır. Tarayıcıda yeniden başlatmayı denemenizi sağlar ve hatta dokümanlardaki her komutla canlı etkileşimli örnekler verir.

Şimdi, yeniden memcached olarak redis için 2 kat fazla yığın akışı sonucu var. 2 kat fazla Google sonucu. Daha fazla dilde daha kolay erişilebilir örnekler. Daha aktif gelişme. Daha aktif müşteri geliştirme. Bu ölçümler bireysel olarak çok fazla bir şey ifade etmeyebilir, ancak kombinasyon halinde yeniden destek için destek ve dokümantasyonun daha büyük ve çok daha güncel olduğu net bir resim çizerler.

süreklilik

Varsayılan olarak redis, anlık görüntü adı verilen bir mekanizma kullanarak verilerinizi diske devam ettirir. Yeterli RAM'iniz varsa, neredeyse hiç performans kaybı olmadan tüm verilerinizi diske yazabilir. Neredeyse ücretsiz!

Anlık görüntü modunda, ani bir kilitlenmenin az miktarda veri kaybına neden olma ihtimali vardır. Hiçbir verinin hiç kaybolmadığından emin olmanız gerekiyorsa, endişelenmeyin, redis, AOF (Yalnızca Dosya Ekle) moduyla da orada arkanıza sahiptir. Bu kalıcılık modunda veriler yazıldığı gibi diske senkronize edilebilir. Bu, maksimum yazma verimliliğini diskinizin yazabildiği kadar hızlı azaltabilir, ancak yine de oldukça hızlı olmalıdır.

İhtiyacınız varsa kalıcılığı ince ayarlamak için birçok yapılandırma seçeneği vardır, ancak varsayılanlar çok mantıklıdır. Bu seçenekler, yeniden depolamayı veri depolamak için güvenli ve yedekli bir yer olarak ayarlamanızı kolaylaştırır. Bu bir olan gerçek bir veritabanı.

Birçok Veri Türü

Memcached dizelerle sınırlıdır, ancak Redis birçok farklı veri türünü sunabilen bir veri yapısı sunucusudur. Ayrıca bu veri türlerinden en iyi şekilde yararlanmak için ihtiyacınız olan komutları da sağlar.

Dizeler ( komutlar )

512 MB boyutuna kadar basit metin veya ikili değerler. Memcached dizeleri 1 MB ile sınırlı olsa da, bu tek veri türü redis ve memcached paylaşımıdır.

Redis, bitsel işlemler, bit seviyesi manipülasyonu, kayan nokta artış / azaltma desteği, aralık sorguları ve çok tuşlu işlemler için komutlar sunarak bu veri türünden yararlanmak için daha fazla araç sunar. Memcached bunların hiçbirini desteklemez.

Dizeler her türlü kullanım durumu için yararlıdır, bu nedenle memcached tek başına bu veri türüyle oldukça yararlıdır.

Hashes ( komutlar )

Hashes, bir anahtar değer deposu içindeki bir anahtar değer deposu gibidir. Dize alanları ve dize değerleri arasında eşleşir. Bir karma kullanan alan-> değer haritaları, normal dizeler kullanan anahtar-> değer haritalarından biraz daha fazla alan verimlidir.

Karmalar bir ad alanı olarak veya birçok anahtarı mantıksal olarak gruplandırmak istediğinizde yararlıdır. Bir karma ile tüm üyeleri verimli bir şekilde kapabilir, tüm üyeleri birlikte doldurabilir, birlikte tüm üyeleri silebilirsiniz, vb Gruplandırılması gereken birkaç anahtar / değer çiftine sahip olduğunuz herhangi bir kullanım durumu için idealdir.

Karma kullanımının bir örneği, uygulamalar arasında kullanıcı profillerini depolamak içindir. Anahtar olarak kullanıcı kimliğiyle saklanan bir yeniden karması, tek bir anahtar altında saklanırken kullanıcı hakkında gerektiği kadar çok veri parçası depolamanıza olanak tanır. Profili bir dizeye serileştirmek yerine bir karma kullanmanın avantajı, başka uygulamaların başkaları tarafından yapılan değişiklikleri geçersiz kılmak zorunda kalmadan (bayat serileştirmeniz durumunda olabilir) farklı uygulamaların kullanıcı profilindeki farklı alanları okuyup yazabilmenizdir. veri).

Listeler ( komutlar )

Redis listeleri sıralı dize koleksiyonlarıdır. Listenin üstünden veya altından (aka: sol veya sağ) değerler eklemek, okumak veya çıkarmak için optimize edilmiştir.

Redis, öğeleri kullanmak için öğeleri itme / pop, komutlar arasında itme / pop, listeleri kesme, aralık sorguları yapma vb. Gibi pek çok komut sağlar .

Listeler büyük dayanıklı, atomik kuyruklar oluşturur. Bunlar iş kuyrukları, günlükler, arabellekler ve diğer birçok kullanım durumu için harika çalışır.

Kümeler ( komutlar )

Kümeler, benzersiz değerlerin sıralanmamış koleksiyonlarıdır. Bir değerin kümede olup olmadığını hızlı bir şekilde kontrol etmenizi, değerleri hızlı bir şekilde ekleyip kaldırmanızı ve diğer kümelerle çakışmayı ölçmenizi sağlamak için optimize edilmiştir.

Bunlar erişim kontrol listeleri, benzersiz ziyaretçi izleyicileri ve daha birçok şey için mükemmeldir. Çoğu programlama dili benzer bir şeye sahiptir (genellikle Set olarak adlandırılır). Bu böyle, sadece dağıtılmış.

Redis, kümeleri yönetmek için birkaç komut sağlar . Set ekleme, çıkarma ve kontrol etme gibi bariz olanlar mevcuttur. Rastgele bir öğeyi açmak / okumak gibi daha az belirgin komutlar ve diğer setlerle sendika ve kavşak gerçekleştirmek için komutlar da öyle.

Sıralı Kümeler ( komutlar )

Sıralama Kümeleri aynı zamanda benzersiz değerlerin koleksiyonlarıdır. Bunlar, adından da anlaşılacağı gibi, sipariş edilir. Bir skorla, sonra sözlükbilimsel olarak sıralanırlar.

Bu veri türü, puana göre hızlı aramalar için optimize edilmiştir. Aradaki en yüksek, en düşük veya herhangi bir değer aralığını elde etmek son derece hızlıdır.

Kullanıcıları yüksek puanlarıyla birlikte sıralı bir kümeye eklerseniz, kendinize mükemmel bir lider panosuna sahip olursunuz. Yeni yüksek puanlar geldikçe, onları yüksek puanlarıyla tekrar sete ekleyin ve lider panonuzu yeniden sipariş edin. Ayrıca, kullanıcıları en son ne zaman ziyaret ettiklerini ve uygulamanızda kimlerin aktif olduğunu takip etmek için de harika.

Aynı skordaki değerlerin saklanması sözlükbilimsel olarak sıralanmasına neden olur (alfabetik olarak düşünün). Bu, otomatik tamamlama özellikleri gibi şeyler için yararlı olabilir.

Sıralanan set komutlarının çoğu, bazen ek bir skor parametresi ile set komutlarına benzer. Ayrıca puanları yönetmek ve puanla sorgulamak için komutlar da dahildir.

Geo

Redis'in coğrafi verileri depolamak, almak ve ölçmek için birkaç komutu vardır . Bu, yarıçap sorgularını ve noktalar arasındaki mesafeleri ölçmeyi içerir.

Redis'teki teknik veriler coğrafi olarak sıralanmış kümelerde saklanır, bu nedenle bu gerçekten ayrı bir veri türü değildir. Sıralı kümelerin üstünde bir uzantıdır.

Bitmap ve HyperLogLog

Coğrafya gibi, bunlar tamamen ayrı veri türleri değildir. Bunlar, dize verilerini bir bitmap veya hiperloglog gibi ele almanızı sağlayan komutlardır.

Bitmap'ler, başvuruda bulunduğum bit düzeyi işleçler Stringsiçin kullanılır. Bu veri türü reddit'in son zamanlardaki işbirlikçi sanat projesi olan r / Place için temel yapı taşıydı .

HyperLogLog, şok edici doğrulukla neredeyse sınırsız benzersiz değerleri saymak için sabit çok az miktarda alan kullanmanıza olanak tanır. Yalnızca ~ 16KB kullanarak, bu sayı milyonlarca olsa bile sitenize gelen benzersiz ziyaretçi sayısını etkili bir şekilde sayabilirsiniz.

İşlemler ve Atomiklik

Redis komutları atomiktir, yani redis'e bir değer yazdığınızda bu değerin redis'e bağlı tüm istemciler tarafından görülebileceğinden emin olabilirsiniz. Bu değerin yayılması için beklemek yok. Teknik olarak memcached de atomiktir, ancak redis ile tüm bu işlevleri memcached'in ötesine ekleyerek, tüm bu ek veri türlerinin ve özelliklerinin de atomik olduğunu belirtmek ve biraz etkileyici.

İlişkisel veritabanlarındaki işlemlerle tam olarak aynı olmasa da, redis ayrıca "iyimser kilitleme" ( WATCH / MULTI / EXEC ) kullanan işlemlere de sahiptir .

Farklı tip boru

Redis, ' ardışık düzen ' adı verilen bir özellik sunar . Yürütmek istediğiniz çok sayıda redis komutunuz varsa, her seferinde bir defada yeniden dağıtmak için bunları bir seferde yeniden göndermek üzere ardışık düzen kullanabilirsiniz.

Normalde yeniden yazma veya memcached komutunu çalıştırdığınızda, her komut ayrı bir istek / yanıt döngüsüdür. Pipelining ile redis, birkaç komutu arabelleğe alabilir ve hepsini bir kerede yürütebilir, tüm komutlarınıza verilen yanıtların tümünü tek bir yanıtla yanıtlayabilir.

Bu, toplu içe aktarma veya çok sayıda komut içeren diğer eylemlerde daha da fazla verim elde etmenizi sağlayabilir.

Pub / Sub

Redis, pub / sub işlevselliğine adanmış komutlara sahiptir ve redis'in yüksek hızlı mesaj yayıncısı olarak işlev görmesini sağlar. Bu, tek bir istemcinin bir kanala bağlı diğer birçok istemciye ileti yayınlamasına olanak tanır.

Redis, hemen hemen her aracı olduğu gibi pub / sub yapar. RabbitMQ gibi özel mesaj brokerlerinin belirli alanlarda avantajları olabilir, ancak aynı sunucunun size sürekli dayanıklı kuyruklar ve pub / alt iş yüklerinizin muhtemelen ihtiyaç duyduğu diğer veri yapılarını verebilmesi, Redis genellikle en iyi ve en basit araç olduğunu kanıtlayacaktır. iş için.

Lua Scripting

Redis'in kendi SQL veya saklı yordamları gibi lua komut dosyalarını düşünebilirsiniz . Hem daha fazla hem de daha az, ama analoji çoğunlukla işe yarıyor.

Belki yeniden düzenlemelerin yapılmasını istediğiniz karmaşık hesaplamalarınız var. Belki de işlemlerinizin geri alınmasını göze alamazsınız ve karmaşık bir sürecin her adımının atomik olarak gerçekleşeceğini garanti etmeniz gerekir. Bu problemler ve daha fazlası lua betikleri ile çözülebilir.

Komut dosyasının tamamı atomik olarak yürütülür, bu nedenle mantığınızı bir lua komut dosyasına sığdırabiliyorsanız, iyimser kilitleme işlemleriyle uğraşmaktan kaçınabilirsiniz.

ölçekleme

Yukarıda belirtildiği gibi, redis kümeleme için yerleşik destek içerir ve kendi yüksek kullanılabilirlik aracı ile birlikte gelir redis-sentinel.

Sonuç

Tereddüt etmeden, yeni projeler veya memcached kullanmayan mevcut projeler için memcached üzerinden redis öneriyorum.

Yukarıda memcached sevmiyorum gibi görünebilir. Aksine: güçlü, basit, kararlı, olgun ve sertleştirilmiş bir araçtır. Yeniden kullanımdan biraz daha hızlı olduğu bazı kullanım durumları bile vardır. Memcached seviyorum. Gelecekteki gelişim için çok anlamlı olduğunu düşünmüyorum.

Redis, memcached'ın yaptığı her şeyi yapar, genellikle daha iyidir. Memcached için herhangi bir performans avantajı küçük ve iş yüküne özgüdür. Ayrıca, redislerin daha hızlı olacağı iş yükleri ve redc'in yapabileceği, memcached'in yapamayacağı birçok iş yükü de vardır. Küçük performans farklılıkları işlevsellikte dev körfez karşısında küçük görünmektedir ve her iki aracın da o kadar hızlı ve verimli olması, altyapınızın ölçekleme konusunda endişelenmeniz gereken son parçası olabilir.

Memcached'ın daha anlamlı olduğu tek bir senaryo vardır: memcached zaten bir önbellek olarak kullanılmaktadır. Memcached ile zaten önbelleğe alıyorsanız, ihtiyaçlarınızı karşılarsa kullanmaya devam edin. Muhtemelen redis'e geçme çabasına değmez ve redis'i sadece önbellekleme için kullanacaksanız, zamanınıza değecek kadar fayda sağlayamayabilir. Memcached ihtiyaçlarınızı karşılamıyorsa, muhtemelen yeniden düzenlemelere geçmelisiniz. Bu, memcached ötesine ölçeklendirmek veya ek işlevsellik ihtiyacınız olsun doğrudur.


11
Memcached, sunucunun kendisinde var olan bir şekilde nasıl kümeleme sunar? Ben her zaman karma algoritmaları veya bir modül kullanarak memcached sunucuları havuzuna dağıtılmış kütüphaneler kullandım. Aynı şey Redis için de söyleniyor. Çoğunlukla Python kullanıyorum ve bağlantı havuzlarını işlemek için memcached kütüphanesine güvenmeyen birkaç modül var gibi görünüyor.
whardier

2
"İyimser kilitlemeli işlemler (WATCH / MULTI / EXEC)" - Redis'in doğru bir işlemi yok. Yani [multi, cmd1, cmd2, cmd3 (istisna), exec] ise cmd1 ve cmd2 yürütülür.
Oleg

10
@Oleg aslında doğru değil. Eğer çoklu yürütme kullanırsanız, komut gerçekleşene kadar komutlar arabelleğe alınır (yani: yürütülmez), bu nedenle exec'den önce bir istisnanız varsa, hiçbir komut yürütülmez. Exec olarak adlandırılırsa, tüm arabelleğe alınmış komutlar atomik olarak yürütülür, elbette, multi çağrılmasından bu yana bir watch değişkeni değiştirilmedikçe. Bu ikinci mekanizma iyimser kilitleme kısmıdır.
Carl Zulauf

3
@whardier Haklısın. Memcached'ın "destek" kümesinin ek araçlar tarafından etkinleştirildiğini yansıtacak şekilde güncellenmiş yanıt. Bunu daha iyi araştırmalıydım.
Carl Zulauf

3
couchbase sunucusuyla kümelemeye ne dersiniz? (memcached uyumlu)
Ken Liu

142

Aşağıdaki durumlarda Redis kullanın

  1. Önbellekteki öğeleri seçici olarak silmeniz / süresinin dolması gerekir. (Buna ihtiyacın var)

  2. Belirli bir türdeki anahtarları sorgulayabilmeniz gerekir. eşi. 'blog1: posts: *', 'blog2: kategoriler: xyz: posts: *'. Ah evet! Bu çok önemli. Belirli türdeki önbelleğe alınmış öğeleri seçici olarak geçersiz kılmak için bunu kullanın. Ayrıca, parça önbelleğini, sayfa önbelleğini, yalnızca belirli bir türdeki AR nesnelerini vb. Geçersiz kılmak için de kullanabilirsiniz.

  3. Kalıcılık (Her yeniden başlatmadan sonra önbelleğinizin ısınması gerekmiyorsa buna da ihtiyacınız olacaktır. Nadiren değişen nesneler için çok önemlidir)

Memcached kullan

  1. Memcached size baş ağrısı verir!
  2. umm ... kümeleme? meh. o kadar ileri gidecek olursanız, parçaları ve AR Nesnelerini önbelleğe almak için Vernik ve Redis kullanın.

Deneyimlerime göre, Redc ile Memcached'den çok daha iyi bir istikrar yaşadım


7
Redis belgeleri, desen kullanmanın tablo taraması gerektirdiğini söylüyor. blog1: posts: * bir O (N) tablo taraması gerektirebilir. Elbette, Redis hızlı olduğu için makul boyutlardaki veri setlerinde hala hızlı. Test veya yönetici için uygun olmalıdır.
Kasım'da

182
Baş ağrısı bir şaka değil mi? :-) Memcached baş ağrısı için googled ama makul bir şey bulamadık. (Memcached ve
Redis'te yeniyim

11
olarak aşağı @pellucide daha aynı nedenle. Redis Memcached'dan daha iyi olabilir, ancak Memcached kullanımı önemsizdir. Onunla hiç bir sorunum olmadı ve yapılandırılması önemsiz.
Diego Jancic

5
@KajMagnus benim günümü yaptığınız için teşekkür ederim .. muhtemelen tüm hafta 😂
alex

@DiegoJancic Redis, kullanımı en kolay teknolojilerden biridir. Önceki Redis bilgisi olmadan, buluttaki bir paket yöneticisini kullanarak Ubuntu'ya yüklemek ve basit sorgular yapmaya başlamak sadece 20 dakika sürdü. 4 saat sonra Lua betiği kullanarak ve performansı artırmak için doğru (NIO) Java kitaplığını seçerek toplu ekler ile daha karmaşık senaryolar POC olabilir. Redis'ten daha kolay ve kullanımı kolay bir şey hayal edemiyorum.
Gevşek Geyik

105

Memcached çok iş parçacıklı ve hızlıdır.

Redis'in birçok özelliği vardır ve çok hızlıdır, ancak bir olay döngüsüne dayandığı için bir çekirdekle tamamen sınırlıdır.

İkisini de kullanıyoruz. Memcached, nesneleri önbelleğe almak için kullanılır ve öncelikle veritabanlarındaki okuma yükünü azaltır. Redis, zaman serisi verilerini toplamak için kullanışlı sıralı kümeler gibi şeyler için kullanılır.


2
Memcached büyük yatırım ve "kullanıcı profili" benzeri ilişkisel olmayan veriler üzerinde db darboğazları olan yüksek trafikli siteler, kanepe tabanı her zamanki Mongo, Redis paralel olarak değerlendirmek gerekir

2
@siliconrockstar - Redis 3'ün hala tek çekirdekli olduğundan emin; en azından AWS Redis (3.2.6 veya 3.2.10 kullanan), örneğin EngineCpuUtilization Metrics
dwanderson 9:18

1
Haklı görünüyorsun, sanırım bu yorumu yaptığımda eksik kaynaklara dayandım. Yorum silindi.
siliconrockstar

ancak yine REDIS ait $ core_count örneklerini başlatabilir
Imaskar

2
Redis son derece verimliliğe odaklanmıştır - bu yüzden kendinize bir grup akıllı geliştiricinin onu neden tek dişli tutmayı seçtiğini sormanız gerekir? "Redis bellek ya da ağa bağlı olduğu için CPU'nun Redis ile darboğazı haline gelmesi çok sık değil". CPU bağlantılı bir huysuz sunucu kullanacaksanız, muhtemelen birçok kullanıcınız vardır ve zaten birden fazla yedek sunucunuz olmalıdır. Tek bir sunucuda birden fazla CPU'yu maksimize etmek istiyorsanız bölümleme kullanın. Okuyun: redis.io/topics/…
robocat

91

Bu, zaten kabul edilmiş cevaba bir yorum olarak gönderilmek için çok uzun, bu yüzden ayrı bir cevap olarak koydum

Dikkate alınması gereken bir nokta da önbellek örneğinizde üst bellek sınırının zor olup olmayacağıdır.

Redis, tonlarca özellik içeren bir nosql veritabanı olduğundan ve önbelleğe alınabilmesi için kullanılabilecek tek bir seçenek olduğundan, belleği ihtiyaç duydukça ayırır - ne kadar çok nesne koyarsanız, o kadar fazla bellek kullanır. Bu maxmemoryseçenek, üst bellek sınırı kullanımını kesin olarak zorunlu kılmaz. Önbellekle çalışırken anahtarlar çıkarılır ve süresi dolar; şansınız anahtarlarınızın hepsi aynı boyutta değildir, bu nedenle dahili bellek parçalanması meydana gelir.

Varsayılan olarak redis, hem bellek kompakt hem de hızlı olmak için elinden gelenin en iyisini yapmaya çalışan jemalloc bellek ayırıcı kullanır , ancak genel amaçlı bir bellek ayırıcıdır ve yüksek oranda meydana gelen çok sayıda ayırma ve nesne temizleme işlemine ayak uyduramaz. Bu nedenle, bazı yük modellerinde redis işlemi, dahili parçalanma nedeniyle bellekten sızabilir. Örneğin, 7 Gb RAM'e sahip bir sunucunuz varsa ve redis'i kalıcı olmayan LRU önbelleği olarak kullanmak istiyorsanız, zaman içinde 5Gb'ye maxmemoryayarlanmış redis işleminin daha fazla bellek kullanacağını ve sonunda toplam RAM sınırına ulaştığını görebilirsiniz. bellek yetersiz katil müdahale ediyor.

memcached, belleğini tamamen farklı bir şekilde yönettiği için yukarıda açıklanan senaryoya daha iyi uyum sağlar. memcached, büyük bir bellek yığını tahsis eder - her zaman ihtiyaç duyacağı her şey - ve sonra kendi uygulanmış levha ayırıcısını kullanarak bu belleği kendiliğinden yönetir . Dahası, memcached , LRU tahliyeleri göz önüne alınan nesne boyutuyla yapıldığında, gerçekte levha başına LRU algoritması kullandığından , iç parçalanmayı düşük tutmaya çalışmaktadır .

Bununla birlikte, memcached, bellek kullanımının zorlanması ve / veya öngörülebilir olması gereken ortamlarda hala güçlü bir konuma sahiptir. En son kararlı redis (2.8.19), 10-15k op / s iş yükünde bir kalıcı olmayan LRU tabanlı memcached değiştirme olarak kullanmaya çalıştık ve bellek A LOT sızdırdı; aynı iş yükü Amazon'un ElastiCache redis örneklerini aynı nedenlerle bir gün içinde çöküyordu.


2
Gönderen redis.io/topics/faq : Redis yerleşik Redis kullanabilirsiniz belleğe bir limit koymak için yapılandırma dosyasında maxmemory seçeneğini kullanarak, bellek kullanımı için maksimum sınırı ayarlamak için kullanıcı izin koruması. Bu sınıra ulaşılırsa Redis, komut yazma hatasıyla yanıt vermeye başlayacaktır (ancak salt okunur komutları kabul etmeye devam edecektir) veya Redis'i kullandığınızda maksimum bellek sınırına ulaşıldığında anahtarları çıkaracak şekilde yapılandırabilirsiniz önbellek için. Redis'i LRU önbelleği olarak kullanmayı planlıyorsanız belgelere sahibiz. bağlantı
StefanNch

8
@StefanNch redis ' maxmemoryseçeneği dahili bellek parçalanmasını hesaba katmaz. Ayrıntılar için lütfen yukarıdaki açıklamama bakın - burada açıkladığım sorunlar, bellek sınırlama seçeneklerinin etkin olduğu "LRU önbellek olarak yeniden oluştur" sayfasında açıklanan senaryoda görüldü. memcached, diğer tarafta, bellek parçalanma sorunu önlemek için farklı bir yaklaşım kullanır, bu nedenle bellek sınırı çok daha "zor".
artyom

46

Memcached basit bir anahtar / değer deposu olmak ve = = STRING anahtarını yapmakta iyidir. Bu, oturum depolaması için gerçekten iyi olmasını sağlar.

Redis anahtar => SOME_OBJECT yapmakta iyidir.

Gerçekten oraya ne koyacağınıza bağlı. Anladığım kadarıyla performans açısından oldukça eşitler.

Ayrıca herhangi bir objektif kriter bulmak iyi şanslar, eğer biraz nazik onları yolumu göndermek bulursanız.


2
IMO Redis Hash veri türü, oturum değişkenlerini depolamak için onları memcached dizeye serileştirmekten çok daha mantıklıdır.
Carl Zulauf

6
Kullanıcı deneyimini önemsiyorsanız, oturumlarınızı önbelleğe almayın. dormando.livejournal.com/495593.html
sleblanc

4
@sebleblanc Bu, teorik olarak Redis ile ilgili bir sorun olmamalı, çünkü disk kalıcılığı da var.
haknick

2
@sebleblanc memcache kötü uyguladığınız veya uygulayamadığınız oturum depolamasında hala iyidir. evet tahliye bir sorun ama yine de aşılamaz, tahliye konusunda endişelenmiyorsanız memcache'nin problemi de değildir. Çoğu memcache oturum çözümlerinin çerezleri yedek olarak kullandığına inanıyorum.
Erik Petersen

11
"Oturumlarınızı önbelleğe almayın" yanıltıcıdır. Ne demek "oturumlarınızı sadece önbellekte saklamak". Önemli verileri yalnızca memcache'de saklayan herkes derhal tetiklenmelidir.
Jacob

37

Crass yazma stiline aldırmazsanız, Systoilet blogunda Redis vs Memcached kullanılabilirlik açısından okunmaya değer, ancak performansla ilgili herhangi bir sonuç çıkarmadan önce yorumlarda ileri ve geri okuduğunuzdan emin olun; bazı metodolojik sorunlar var (tek iş parçacıklı meşgul döngü testleri) ve Redis makalenin yazılmasından bu yana bazı iyileştirmeler yaptı.

Ve hiçbir kriter bağlantı yüzden de bazı çelişkili kriterler göz atın işleri biraz kafa karıştırıcı olmadan tamamlandı Dormondo en LiveJournal ve Antirez Weblog .

Düzenleme - Antirez'in belirttiği gibi, Systoilet analizi oldukça kötü tasarlanmış. Tek iş parçacıklı eksikliğin ötesinde bile, bu kıyaslama ölçütlerindeki performans eşitsizliğinin çoğu, sunucu işlem hacminden ziyade istemci kitaplıklarıyla ilişkilendirilebilir. Antirez Weblog'daki kriterler gerçekten çok daha fazla elma-elma (aynı ağızlı) karşılaştırması sunuyor.



28
Küfür hakkında şaka yapmıyordun.
ocodo

1
2010, modası geçmiş blogu hakkında daha fazlası
Siddharth

24

Üzerinde çalıştığım önbellek proxy'de hem memcached hem de redis'i birlikte kullanma fırsatı buldum, tam olarak ne ve neden arkasında kullandığımı paylaşmama izin verin ....

Redis>

1) Önbellek içeriğini küme üzerinden dizine eklemek için kullanılır. Redis kümelerine yayılmış milyardan fazla anahtarım var, redis yanıt süreleri oldukça az ve kararlı.

2) Temel olarak, onun bir anahtar / değer deposu, bu yüzden uygulamada herhangi bir yerde benzer bir şeye sahipseniz, bir çok rahatsız edici redis kullanabilirsiniz.

3) Kalıcılığı, yük devretmeyi ve yedeklemeyi (AOF) azaltın, işinizi kolaylaştıracaktır.

Memcache>

1) evet, önbellek olarak kullanılabilecek optimize edilmiş bir bellek. Önbellek içeriğini 1 MB'den daha küçük boyutta (50 vuruş / saniye) çok sık erişilmesini sağlamak için kullandım.

2) Tek içerik boyutum> 1 MB olduğunda memcached için 16 GB'den sadece 2 GB ayırdım.

3) İçerik sınırlara yaklaştıkça, bazen istatistiklerde daha yüksek yanıt süreleri gözlemledim (redis ile değil).

Genel deneyim istiyorsanız Redis, yapılandırılması kolay olduğu kadar yeşil, kararlı sağlam özellikleri ile çok esnektir.

Ayrıca, bu bağlantıda bir kıyaslama sonucu var , aşağıda birkaç higlight var,

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Bu yardımcı olur umarım!!


14

Ölçek. Bazı basit ölçütler çalıştırın. Uzun zamandır kendimi eski bir okul gergedanı olarak gördüm çünkü çoğunlukla memcached kullandım ve Redis'i yeni çocuk olarak gördüm.

Mevcut şirketim ile Redis ana önbellek olarak kullanıldı. Bazı performans istatistiklerine girdiğimde ve basitçe test etmeye başladığımda, Redis performans açısından MySQL'den karşılaştırılabilir veya minimum derecede yavaştı .

Memcached, basit olmasına rağmen, Redis'i tamamen sudan havaya uçurdu . Çok daha iyi ölçeklendi:

  • daha büyük değerler için (döşeme boyutunda gerekli değişiklik, ancak çalıştı)
  • birden fazla eşzamanlı istek için

Ayrıca, memcached tahliye politikası benim görüşüme göre, çok daha iyi uygulanmış, böylece önbellek işleyebileceğinden daha fazla veri işlerken genel olarak daha kararlı ortalama yanıt süresi ile sonuçlanır.

Bazı kıyaslamalar Redis'in bizim durumumuzda çok kötü performans gösterdiğini ortaya koydu. Bu birçok değişken ile ilgili olduğuna inanıyorum:

  • çalıştırdığınız donanım türü Redis
  • sakladığınız veri türleri
  • alma ve set miktarı
  • uygulamanızın ne kadar eşzamanlı olduğu
  • veri yapısı depolamasına ihtiyacınız var mı

Şahsen, Redis yazarlarının eşzamanlılık ve çoklu kullanım ile ilgili görüşlerini paylaşmıyorum.


lütfen "MySQL'den çok daha yavaş" ifadesini açıklayın.
Anirudha Gupta

Bu ölçüt verilerinin elimde olmadığı ancak bu özel durumun çok fazla okuma / yazma opsiyonu olduğu söylendi
mdomans

13

Başka bir avantaj da, memcache'nin önbellekleme senaryosunda nasıl davranacağının çok açık olabileceğidir, ancak redis genellikle kalıcı bir veri deposu olarak kullanılır, ancak maks. kapasite.

Çalıştığım bazı uygulamalar hem verileri nasıl davranacağımızı netleştirmek için kullanıyorum - memcache'deki şeyler, orada olmayan durumları ele almak için kod yazıyoruz - redis'te şeyler, orada olduğuna güveniyoruz .

Bunun dışında Redis, çoğu özellik açısından daha zengin özellikli ve dolayısıyla esnek olduğu için genellikle üstün kabul edilir.


10

Memcached sadece bir önbellekken redis'in (önbellek + veri yapısı) birleşimi olduğunu söylesek yanlış olmaz.


1
bu iyi bir yanıt - Laravel redis'i önbellek ve veri depolama mekanizması olarak kullanıyor
Miroslav Trninic

8

100k benzersiz anahtarları ve değerleri redis-2.2.2 ve memcached'a karşı ayarlamak ve almak için çok basit bir test. Her ikisi de linux VM'de (CentOS) çalışıyor ve istemci kodum (aşağıda yapıştırılmış) Windows masaüstünde çalışıyor.

Redis

  • 100000 değeri saklamak için geçen süre = 18954 ms

  • 100000 değeri yüklemek için geçen süre = 18328 ms

memcached

  • 100000 değeri saklamak için geçen süre = 797 ms'dir.

  • 100000 değerin alınması için geçen süre = 38984 ms'dir.


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

6
Açıkçası ölçüm için Java kullandığınızdan .... test durumlarınızı "ısıttınız mı?" Bu, JIT'in sıcak noktaları derlediği kısa bir zamanı ölçmek için çok önemlidir.
cljk

7

Burada belirtilmeyen önemli bir fark, Memcache'nin her zaman üst bellek sınırına sahip olması ve Redis'in varsayılan olarak olmamasıdır (ancak yapılandırılabilir). Bir anahtar / değeri her zaman belirli bir süre saklamak (ve düşük bellek nedeniyle asla boşaltmamak) istiyorsanız, Redis ile gitmek istersiniz. Elbette, hafızanızın tükenmesi sorununu da riske atıyorsunuz ...


6

Geriye kalan en büyük neden uzmanlaşmadır.

Redis birçok farklı şey yapabilir ve bunun bir yan etkisi, geliştiricilerin aynı örnek üzerinde birçok farklı özellik kümesini kullanmaya başlayabilmesidir. Redis'in LRU özelliğini, LRU DEĞİL olan yan sabit veri depolaması boyunca bir önbellek için kullanıyorsanız, belleğin bitmesi tamamen mümkündür.

SADECE LRU örneği olarak kullanılmak üzere özel bir Redis örneği ayarlayacaksanız, Redis'i Memcached üzerinden kullanmak için gerçekten zorlayıcı bir neden yoktur.

Güvenilir bir "asla inmez" LRU önbelleğine ihtiyacınız varsa ... Memcached, tasarıma göre hafızanın tükenmesi imkansız olduğundan ve uzmanlık işlevinin geliştiricilerin bunu tehlikeye atabilecek bir şey yapmaya çalışmasını önlediğinden faturaya uyacaktır. Endişelerin basit bir şekilde ayrılması.


6

Performansla ilgileniyorsanız Memcached daha hızlı olacaktır, çünkü Redis ağ iletişimi (TCP çağrıları) içermesine rağmen. Ayrıca dahili olarak Memcache daha hızlıdır.

Redis, diğer cevaplarda belirtildiği gibi daha fazla özelliğe sahiptir.


6

Redis'i işteki projemiz için bir yük kalkışı olarak düşündük. Biz modülü kullanarak düşünülmektedir nginxdenilen HttpRedis2Modulebiz müthiş hızı olurdu ya da benzer bir şey ama biz yanlış kanıtlanmış ediyoruz AB-testi ile test ederken.

Belki modül kötü ya da bizim düzenimiz vardı ama çok basit bir görevdi ve php ile veri almak ve daha sonra MongoDB içine doldurmak daha hızlı oldu. APC'yi önbellek sistemi olarak ve bu php ve MongoDB ile kullanıyoruz. nginxRedis modülünden çok daha hızlıydı .

Benim tavsiyem, bunu kendiniz test etmek, bunu yapmak çevreniz için sonuçları gösterecektir. Redis'i kullanmanın hiçbir anlam ifade etmeyeceği için projemizde gereksiz olduğuna karar verdik.


İlginç bir cevap ama OP yardımcı olur emin değilim
Scott Schulthess

Redis'e ekleme ve önbellek olarak kullanma APC + PHP + MongoDB kullanmaktan daha yavaştı. Ancak sadece Redis'e ekleme, doğrudan MongoDB'ye yerleştirmekten çok daha yavaştı. APC olmadan bence oldukça eşitler.
Ms01

2
Thats Mongo size Eklediğiniz ne dair herhangi bir garanti vermez çünkü hiç diske yazılır olacak ...
Damian

21
ancak web ölçeğidir, yazarken mongodb çevrelerinizde dolaşacaktır. Bugünlerde sadece / dev / null yazıyorum çünkü bu en hızlı olanı.
Ms01

1

Redis daha iyi.

Artıları Redis,

  1. Dize, kümeler, sıralı kümeler, karmalar, bitmapler gibi birçok veri depolama seçeneğine sahiptir.
  2. Kayıtların Disk Kalıcılığı
  3. Saklı Yordam ( LUAkomut dosyası yazma) desteği
  4. PUB / SUB kullanarak Message Broker işlevi görebilir

Halbuki Memcachebir bellek içi anahtar değeri önbellek tipi sistemidir.

  1. Listeler gibi çeşitli veri türü depoları için destek yok, redis'deki gibi ayarlar.
  2. Ana con Memcache disk kalıcılığı yoktur.

0

Ben çoğunlukla hem uygulamalarım, oturumları önbelleğe almak için Memcache ve doktrin / orm sorgu nesneleri için redis ile kullandım. Performans açısından her ikisi de neredeyse aynı.


0

İşte Amazon tarafından sağlanan gerçekten harika makale / farklılıklar

Redis, memcached ile karşılaştırıldığında açık bir kazanandır.

Memcached için sadece bir artı nokta Çok iş parçacıklı ve hızlıdır. Redis'in birçok harika özelliği vardır ve çok hızlıdır, ancak bir çekirdek ile sınırlıdır.

Memcached'da desteklenmeyen Redis hakkında harika noktalar

  • Anlık Görüntüler - Kullanıcı, Redis önbelleğinin anlık görüntüsünü alabilir ve herhangi bir zamanda ikincil depolamada kalabilir.
  • Set, Map, SortedSet, List, BitMaps gibi birçok veri yapısı için dahili destek.
  • Redis'te Lua komut dosyası desteği
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.