Ö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.
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.
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, 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).
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, 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 Strings
iç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.