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 maxmemory
sı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.