Redis, önbelleğe alma konusunda Memcached'i neden geride bırakıyor?

Memcached veya Redis? Modern, veritabanı odaklı bir web uygulamasından daha fazla performans elde etmekle ilgili her tartışmada neredeyse her zaman ortaya çıkan bir sorudur. Performansın iyileştirilmesi gerektiğinde, önbelleğe alma genellikle atılan ilk adımdır ve Memcached veya Redis genellikle ilk dönülecek yerlerdir.

Bu ünlü önbellek motorları bir dizi benzerliği paylaşır, ancak aynı zamanda önemli farklılıkları da vardır. İkisinin daha yeni ve çok yönlü olanı Redis, neredeyse her zaman üstün seçimdir.

Önbelleğe alma için Redis ve Memcached

Benzerliklerle başlayalım. Hem Memcached hem de Redis, bellek içi, anahtar-değer veri depoları olarak işlev görür, ancak Redis daha doğru bir şekilde bir veri yapısı deposu olarak tanımlanır. Hem Memcached hem de Redis, NoSQL veri yönetimi çözümleri ailesine aittir ve her ikisi de bir anahtar-değer veri modeline dayanmaktadır. Her ikisi de tüm verileri RAM'de tutar, bu da onları bir önbellek katmanı olarak son derece kullanışlı kılar. Performans açısından, iki veri deposu da oldukça benzerdir ve işlem hacmi ve gecikme açısından neredeyse aynı özellikleri (ve ölçümleri) sergiler.

Hem Memcached hem de Redis, olgun ve oldukça popüler açık kaynaklı projelerdir. Memcached ilk olarak 2003 yılında Brad Fitzpatrick tarafından LiveJournal web sitesi için geliştirildi. O zamandan beri Memcached, C dilinde yeniden yazıldı (orijinal uygulama Perl'de idi) ve modern Web uygulamalarının temel taşı haline geldiği kamuya açık hale getirildi. Memcached'in mevcut gelişimi, yeni özellikler eklemek yerine kararlılık ve optimizasyonlara odaklanmıştır.

Redis, 2009 yılında Salvatore Sanfilippo tarafından oluşturuldu ve Sanfilippo bugün projenin baş geliştiricisi olmaya devam ediyor. Redis bazen "Steroidler üzerinde Memcached" olarak tanımlanır ve bu, Redis'in parçalarının Memcached kullanımından öğrenilen derslere yanıt olarak inşa edildiği düşünüldüğünde pek de şaşırtıcı değildir. Redis, Memcached'den daha fazla özelliğe sahiptir ve bu nedenle daha güçlü ve esnektir.

Pek çok şirket tarafından ve görev açısından kritik öneme sahip sayısız üretim ortamında kullanılan Memcached ve Redis, akla gelebilecek her programlama dilinde istemci kitaplıkları tarafından desteklenir ve geliştiriciler için çok sayıda pakete dahildir. Aslında, Memcached veya Redis için yerleşik destek içermeyen nadir bir web yığınıdır.

Memcached ve Redis neden bu kadar popüler? Sadece son derece etkili değil, aynı zamanda nispeten basitler. Memcached veya Redis'i kullanmaya başlamak, bir geliştirici için kolay bir iş olarak kabul edilir. Kurmak ve bir uygulamayla çalışmasını sağlamak yalnızca birkaç dakika sürer. Bu nedenle, küçük bir zaman ve çaba yatırımı, performans üzerinde ani ve dramatik bir etkiye sahip olabilir - genellikle büyüklük derecelerine göre. Çok büyük fayda sağlayan basit bir çözüm; bu sihire olabildiğince yakın.

Memcached ne zaman kullanılır?

HTML kod parçaları gibi nispeten küçük ve statik verileri önbelleğe alırken Memcached tercih edilebilir. Memcached'in dahili bellek yönetimi, Redis'inki kadar karmaşık olmasa da, meta veriler için nispeten daha az bellek kaynağı tükettiği için en basit kullanım durumlarında daha verimlidir. Dizeler (Memcached tarafından desteklenen tek veri türü) yalnızca okunan verileri depolamak için idealdir, çünkü dizeler daha fazla işlem gerektirmez.

Büyük veri kümeleri genellikle, depolamak için her zaman daha fazla alan gerektiren serileştirilmiş verileri içerir. Memcached etkin bir şekilde verileri serileştirilmiş biçiminde depolamakla sınırlıyken, Redis'teki veri yapıları verilerin herhangi bir yönünü yerel olarak depolayabilir ve böylece serileştirme ek yükünü azaltır.

Memcached'in Redis'e göre bir avantaja sahip olduğu ikinci senaryo ölçeklendirmedir. Memcached çok iş parçacıklı olduğundan, ona daha fazla hesaplama kaynağı vererek ölçeği kolayca artırabilirsiniz, ancak önbelleğe alınan verilerin bir kısmını veya tamamını kaybedersiniz (tutarlı hashing kullanıp kullanmamanıza bağlı olarak). Çoğunlukla tek iş parçacıklı olan Redis, veri kaybı olmadan kümeleme yoluyla yatay olarak ölçeklenebilir. Kümeleme, etkili bir ölçeklendirme çözümüdür, ancak kurulumu ve çalıştırması nispeten daha karmaşıktır.

Redis ne zaman kullanılır?

Veri yapıları nedeniyle neredeyse her zaman Redis'i kullanmak isteyeceksiniz. Önbellek olarak Redis ile, çok fazla güç (örneğin, önbellek içeriğine ince ayar yapma ve dayanıklılık) ve genel olarak daha fazla verimlilik elde edersiniz. Veri yapılarını kullandığınızda, belirli uygulama senaryoları için verimlilik artışı muazzam hale gelir.

Redis'in üstünlüğü, önbellek yönetiminin hemen hemen her alanında belirgindir. Önbellekler, eski verileri bellekten silerek yeni verilere yer açmak için veri çıkarma adı verilen bir mekanizma kullanır. Memcached'in veri tahliye mekanizması, En Son Kullanılan bir algoritma kullanır ve yeni verilere benzer büyüklükteki verileri biraz keyfi olarak çıkarır.

Redis, aksine, tahliye üzerinde ayrıntılı bir kontrole izin vererek altı farklı tahliye politikasından birini seçmenize olanak tanır. Redis ayrıca bellek yönetimi ve tahliye adayı seçimi için daha karmaşık yaklaşımlar kullanır. Redis, verilerin yalnızca daha fazla alana ihtiyaç duyulduğunda veya proaktif olarak tahliye edildiği hem tembel hem de etkin tahliyeyi destekler. 

Redis, önbelleğe alabileceğiniz nesnelerle ilgili olarak size çok daha fazla esneklik sağlar. Memcached, anahtar adlarını 250 bayta sınırlarken ve yalnızca düz dizelerle çalışırken, Redis anahtar adlarının ve değerlerin her biri 512MB kadar büyük olmasına izin verir ve bunlar ikili olarak güvenlidir. Ayrıca Redis, akıllı önbelleğe alma ve önbelleğe alınmış verilerin manipülasyonu yoluyla uygulama geliştiricisine bir olasılıklar dünyası açan, aralarından seçim yapabileceğiniz beş birincil veri yapısına sahiptir.

Veri kalıcılığı için Redis

Redis veri yapılarını kullanmak, yalnızca önbelleğe alma sırasında değil, verilerin kalıcı ve her zaman kullanılabilir olmasını istediğinizde bile birkaç görevi basitleştirebilir ve optimize edebilir. Örneğin, nesneleri serileştirilmiş dizeler olarak depolamak yerine, geliştiriciler bir nesnenin alanlarını ve değerlerini depolamak ve bunları tek bir anahtar kullanarak yönetmek için bir Redis Hash kullanabilir. Redis Hash, geliştiricilere tüm dizeyi alma, seriyi kaldırma, bir değeri güncelleme, nesneyi yeniden seri hale getirme ve her önemsiz güncelleme için önbellekteki tüm dizeyi yeni değeriyle değiştirme ihtiyacından kurtarır - bu, daha düşük kaynak tüketimi ve daha yüksek performans anlamına gelir.

Redis tarafından sunulan diğer veri yapıları (listeler, kümeler, sıralı kümeler, hiperlog günlükler, bit eşlemler ve jeo-uzamsal dizinler gibi) daha da karmaşık senaryoları uygulamak için kullanılabilir. Zaman serisi veri alımı ve analizi için sıralı kümeler, son derece azaltılmış karmaşıklık ve daha düşük bant genişliği tüketimi sunan bir Redis veri yapısının başka bir örneğidir.

Redis'in bir diğer önemli avantajı da, depoladığı verilerin opak olmaması, dolayısıyla sunucunun bunları doğrudan değiştirebilmesidir. Redis'te bulunan 180'den fazla komutun önemli bir kısmı, veri işleme işlemlerine ve sunucu tarafı Lua komut dosyası aracılığıyla veri deposunun içine mantık yerleştirmeye ayrılmıştır. Bu yerleşik komutlar ve kullanıcı komut dosyaları, veri işleme görevlerini ağ üzerinden işleme için başka bir sisteme göndermek zorunda kalmadan doğrudan Redis'te işleme esnekliği sağlar.

Redis, planlı bir kapatma veya planlanmamış bir arızadan sonra önbelleği önyüklemek için tasarlanmış isteğe bağlı ve ayarlanabilir veri kalıcılığı sunar. Önbelleklerdeki verileri geçici ve geçici olarak görme eğiliminde olsak da, verileri diske kaydetmeye devam etmek, önbelleğe alma senaryolarında oldukça değerli olabilir. Önbelleğin verilerinin, yeniden başlatmanın hemen ardından yüklenmek üzere hazır olması, çok daha kısa önbellek ısınmasına izin verir ve önbellek içeriğinin birincil veri deposundan yeniden doldurulması ve yeniden hesaplanmasıyla ilgili yükü ortadan kaldırır.

Redis bellek içi veri çoğaltması 

Redis, yönettiği verileri de kopyalayabilir. Çoğaltma, hatalara dayanabilen ve uygulamaya kesintisiz hizmet sağlayabilen yüksek düzeyde kullanılabilir bir önbellek kurulumunu uygulamak için kullanılabilir. Bir önbellek hatası, kullanıcı deneyimi ve uygulama performansı üzerindeki etki açısından uygulama başarısızlığının biraz gerisinde kalmaktadır, bu nedenle önbelleğin içeriğini ve hizmet kullanılabilirliğini garanti eden kanıtlanmış bir çözüme sahip olmak çoğu durumda büyük bir avantajdır.

Son olarak, operasyonel görünürlük açısından Redis, kullanımı ve anormal davranışları izlemek ve izlemek için bir dizi ölçüm ve çok sayıda iç gözlemli komut sağlar. Veritabanının her yönüyle ilgili gerçek zamanlı istatistikler, yürütülen tüm komutların görüntülenmesi, istemci bağlantılarının listelenmesi ve yönetilmesi - Redis tüm bunlara ve daha fazlasına sahiptir.

Geliştiriciler Redis'in kalıcılığının ve bellek içi çoğaltma yeteneklerinin etkinliğini anladıklarında, bunu genellikle yüksek hızlı verileri analiz etmek ve işlemek ve ikincil (genellikle daha yavaş) bir veritabanı korurken kullanıcıya yanıtlar sağlamak için ilk yanıt veren veritabanı olarak kullanırlar. olanların tarihsel bir kaydı. Bu şekilde kullanıldığında Redis, analitik kullanım örnekleri için de ideal olabilir.

Veri analizi için Redis

Akla hemen üç analitik senaryosu gelir. İlk senaryoda, büyük veri kümelerini yinelemeli olarak işlemek için Apache Spark gibi bir şey kullanırken, daha önce Spark tarafından hesaplanan veriler için bir sunum katmanı olarak Redis'i kullanabilirsiniz. İkinci senaryoda, paylaşılan, bellek içi, dağıtılmış veri deponuz olarak Redis'i kullanmak, Spark işlem hızlarını 45 ila 100 kat hızlandırabilir. Son olarak, çok yaygın bir senaryo, raporların ve analitiklerin özelleştirilebilir olması gereken bir senaryodur. kullanıcı, ancak doğal olarak toplu veri depolarından (Hadoop veya RDBMS gibi) veri almak çok uzun sürüyor. Bu durumda, Redis gibi bir bellek içi veri yapısı deposu, milisaniyenin altındaki sayfalama ve yanıt süreleri elde etmenin tek pratik yoludur.

Son derece büyük operasyonel veri kümeleri veya analitik iş yükleri kullanırken, her şeyi bellekte çalıştırmak uygun maliyetli olmayabilir. Redis Labs, daha düşük maliyetle milisaniyenin altında bir performans elde etmek için RAM ve flash oranlarını yapılandırma seçeneğiyle birlikte RAM ve flash kombinasyonunda çalışan bir Redis sürümü oluşturdu. Bu, iş yükü işlemeyi hızlandırmak için birkaç yeni yol açarken, geliştiricilere sadece "önbelleğini flash üzerinde çalıştırma" seçeneği de sunar.

Açık kaynaklı yazılım, bugün mevcut olan en iyi teknolojilerden bazılarını sağlamaya devam ediyor. Önbelleğe alma yoluyla uygulama performansını artırmak söz konusu olduğunda, Redis ve Memcached en köklü ve üretimde kendini kanıtlamış adaylardır. Bununla birlikte, Redis'in daha zengin işlevselliği, daha gelişmiş tasarımı, birçok potansiyel kullanımı ve geniş ölçekte daha yüksek maliyet verimliliği göz önüne alındığında, Redis neredeyse her durumda ilk tercihiniz olmalıdır.

---

Itamar Haber (@itamarhaber), geliştiriciler için tam olarak yönetilen bulut hizmetleri olarak Memcached ve Redis sunan Redis Labs'ın baş geliştirici savunucusudur. Çeşitli deneyimleri arasında Xeround, Etagon, Amicada ve MNS Ltd.'de yazılım ürünü geliştirme ve yönetimi ve liderlik rolleri bulunmaktadır. Itamar, Northwestern ve Tel-Aviv Üniversiteleri tarafından ortak Kellogg-Recanati programından İşletme Yüksek Lisansının yanı sıra bir Lisans derecesine sahiptir. Bilgisayar Bilimlerinde Bilim.

Yeni Teknoloji Forumu, ortaya çıkan kurumsal teknolojiyi benzeri görülmemiş bir derinlik ve genişlikte keşfetmek ve tartışmak için bir mekan sağlar. Seçim özneldir, önemli olduğuna inandığımız ve okuyucuların en çok ilgisini çeken teknolojileri seçmemize dayanır. yayın için pazarlama materyallerini kabul etmez ve katkıda bulunan tüm içeriği düzenleme hakkını saklı tutar. Tüm sorularınızı [email protected] adresine gönderin.