Yan yana
RedisvsMemcached
Redis ile Memcached arasındaki fark nedir?
Güncellendi 3 dk okuma7 fark
Kısaca
İkisi de veriyi bellekte tutar; Memcached sade ve çok iş parçacıklı bir önbellektir, Redis ise veri yapıları, kalıcılık, replikasyon ve mesajlaşma ekler.
Redis
Remote Dictionary Server
Redis, okuma ve yazmayı milisaniyenin çok altında yapan bellek içi bir anahtar-değer deposudur; önbellek, oturum deposu ve mesaj aracısı olarak yaygındır.
Redis sayfasını okuMemcached
Memcached, veritabanlarının yükünü hafifletip uygulamaları hızlandırmak için küçük verileri RAM'de tutan, açık kaynaklı bir anahtar-değer önbelleğidir.
Memcached sayfasını okuRedis ve Memcached karşılaştırması
| Özellik | Redis | Memcached |
|---|---|---|
| Veri modeli | Metin, liste, küme, sıralı küme, hash, akış ve dahası | Düz anahtar ve değerler; değerler içine bakılmayan baytlardır |
| Kalıcılık | Diske isteğe bağlı anlık görüntüler ve yalnızca ekleme yapılan günlük | Yok: yeniden başlatmada veri kaybolur |
| Replikasyon ve kümeleme | Yerleşik replikalar, Sentinel ile failover ve Redis Cluster | Sunucuda yok; anahtarları istemciler düğümlere dağıtır |
| İş parçacıkları | Komutlar tek bir ana iş parçacığında; ağ G/Ç'si için ek iş parçacıkları | Çok iş parçacıklı: tek süreç bütün çekirdekleri kullanır |
| Değer boyutu | Değer başına en fazla 512 MB | Varsayılan olarak değer başına en fazla 1 MB |
| Ekstralar | Pub/sub, akışlar, Lua betikleri, transaction'lar | Süre dolumu, LRU ile atma ve basit sayaçlar dışında pek bir şey yok |
| En uygun | Önbelleğin yanında oturumlar, sayaçlar, sıralama tabloları, kuyruklar ve mesajlaşma | Serileştirilmiş nesnelerden ya da sayfa parçalarından oluşan büyük, basit önbellekler |
Fark, açıklamalı
Redis ve Memcached, milisaniyenin çok altında yanıt veren bellek içi anahtar-değer depolarıdır ve ikisi de çoğunlukla daha yavaş bir veritabanının önünde önbellek olarak kullanılır. 2003'te yazılan Memcached saf bir önbellektir: değerleri anahtarların altında, içlerine bakmadan saklar ve neredeyse başka hiçbir şey yapmaz. 2009'da geliştirilen Redis ise bir veri yapısı sunucusudur: değerleri metin, liste, küme, sıralı küme, hash ve akış olabilir; yalnızca önbellek olarak değil, birincil veri deposu olarak da çalışabilir.
Fark, kapsamdan gelir. Memcached özellik kümesini bilerek küçük tutar: değerler düz baytlardır, öğelerin süresi dolar ya da bellek dolunca atılırlar ve yeniden başlatmadan sonra veri gider. Sunucuları birbiriyle hiç konuşmaz; her anahtar için sunucuyu, anahtarı hash'leyerek istemci seçer. Redis ise diske kalıcılık, replikasyon, yerleşik kümeleme, pub/sub, Lua betikleri ve veri türleri üzerinde atomik işlemler ekler; bir sayaçta INCR ya da bir sıralama tablosunda ZADD gibi. Böylece Memcached ile oku-değiştir-yaz turu gerektirecek işler sunucunun içinde gerçekleşir.
Çalışma modelleri de farklıdır. Memcached çok iş parçacıklıdır ve tek bir süreçte bütün CPU çekirdeklerini kullanır; bu da onu büyük ve basit önbellekler için çok verimli kılar. Redis komutları tek bir ana iş parçacığında çalıştırır, bu sayede her komut atomiktir; ölçeklenmek için birden fazla örnek ya da bir küme çalıştırılır, yeni sürümler de ağ G/Ç'si için ek iş parçacıkları kullanır. Pratikte ikisi de o kadar hızlıdır ki darboğaz genellikle ağdır.
Sık yapılan bir yanlış, Redis'in Memcached'i gereksiz kıldığını düşünmektir. Serileştirilmiş nesnelerden ya da HTML parçalarından oluşan büyük, gözden çıkarılabilir bir önbellek için Memcached'i işletmek hâlâ daha kolaydır, bellek açısından da çok verimlidir; pek çok büyük site onu hâlâ kullanır. Ters yöndeki hata, Redis'i yalnızca bir önbellek saymaktır: veri türlerine, kalıcılığa ya da pub/sub'a bir kez dayandığınızda Memcached artık doğrudan onun yerine geçemez. Redis 2024'te lisansını değiştirdiğinden beri Linux Foundation'ın açık kaynaklı çatallaması Valkey aynı komutları sunuyor.
Hangisini kullanmalısınız?
Redis şu durumlarda doğru seçim:
- Metinden fazlasına ihtiyacınız var: sayaçlar, sıralama tabloları için sıralı kümeler, hash'ler ya da akışlar.
- Veri yeniden başlatmadan sonra da kalmalı ya da başka bir sunucuya replike edilmeli.
- Aynı depodan pub/sub mesajlaşma, kuyruklar ya da hız sınırlama da istiyorsunuz.
- Birkaç işlemin sunucuda, transaction'lar ya da Lua betikleriyle atomik olarak gerçekleşmesi gerekiyor.
Memcached şu durumlarda doğru seçim:
- Bir veritabanının önünde yalnızca hızlı ve gözden çıkarılabilir bir önbelleğe ihtiyacınız var.
- Değerler, uygulamanın önbellekte bulamadığında yeniden üretebileceği serileştirilmiş nesneler ya da HTML parçaları.
- Çok az ayarla, tek bir sürecin birçok CPU çekirdeğini kullanmasını istiyorsunuz.
- Altyapınız onu zaten çalıştırıyor ve fazlasına ihtiyaç duymuyor.
Bir değeri önbelleğe alma, sonra bir skoru artırma (Python)
# Redis: a cache entry, plus a data structure kept on the server
import redis
r = redis.Redis(host="localhost", port=6379)
r.set("user:42:profile", profile_json, ex=300) # expires in 5 minutes
# Leaderboard: the sorted set lives in Redis, updated atomically
r.zincrby("leaderboard", 10, "alice")
top3 = r.zrevrange("leaderboard", 0, 2, withscores=True)# Memcached: values are opaque bytes with an expiry time
import json
from pymemcache.client.base import Client
mc = Client(("localhost", 11211))
mc.set("user:42:profile", profile_json, expire=300)
# Leaderboard: read the whole value, change it, write it back
board = json.loads(mc.get("leaderboard") or "{}")
board["alice"] = board.get("alice", 0) + 10
mc.set("leaderboard", json.dumps(board)) # not atomicSık sorulan sorular
Redis, Memcached'den daha mı hızlı?
Basit get ve set işlemlerinde birbirlerine yakındırlar ve süreyi genellikle ağdaki gidiş-dönüş belirler. Memcached tek bir süreçte birçok çekirdekten daha iyi yararlanır; Redis ise veri türleri sayesinde istek başına daha fazla iş yapabilir.
Redis, Memcached'in yerini alabilir mi?
Genellikle evet: Redis, eviction ve sona erme süreleriyle saf bir önbellek olarak çalışabilir ve çoğu istemci kütüphanesi geçişi kolaylaştırır. Bedeli, kullanmayabileceğiniz özelliklere sahip, biraz daha karmaşık bir sunucudur.
Memcached veriyi diske kaydeder mi?
Hayır; varsayılan olarak her şey bellekte yaşar ve yeniden başlatmada kaybolur. Onu, içeriği her zaman asıl veritabanından yeniden oluşturulabilen bir önbellek olarak düşünün.