Redis nedir sorusunun kısa cevabı şu: verileri diskte değil doğrudan bellekte tutan, bu yüzden alışılmış veritabanlarından kat kat hızlı çalışan açık kaynaklı bir veri deposu. Bir web uygulaması yavaşladığında, aynı sorguyu her istekte tekrar veritabanına göndermek yerine sonucu Redis'te önbelleğe alırsınız ve yanıt süresi saniyelerden milisaniyelere iner. Bu yazıda Redis'in ne olduğunu, nerede kullanıldığını, temel veri tiplerini, verileri diske nasıl yazdığını ve Docker ile parolalı, kalıcı bir kurulumu nasıl yapacağınızı anlatıyorum.
Kısaca: Redis, verileri diskte değil bellekte (RAM) tutan açık kaynaklı bir veri deposudur. Bu sayede okuma yazma işlemleri mikrosaniyeler sürer. En sık önbellek, oturum saklama, hız sınırlama ve iş kuyruğu olarak kullanılır. String, hash, list ve set gibi hazır veri tipleri sunar. İsteğe bağlı olarak RDB ve AOF ile verileri diske de yazabilir.
Redis nedir ve ne işe yarar?
Redis, 2009'da doğmuş, bugün en yaygın kullanılan bellek içi veri depolarından biridir. İsmi "Remote Dictionary Server" ifadesinden gelir ve bu isim çalışma mantığını da özetler: uzaktan erişilebilen dev bir sözlük gibi, her veriyi bir anahtar altında saklar. Uygulamanız bir anahtar verir, Redis o anahtara bağlı değeri anında döndürür.
Redis (Remote Dictionary Server), anahtar değer modeliyle çalışan bellek içi bir veri deposudur. Verileri RAM'de tuttuğu için geleneksel disk tabanlı veritabanlarından çok daha hızlı yanıt verir ve önbellekleme, oturum yönetimi ve gerçek zamanlı işlemler için tercih edilir.
Buradaki kilit fikir şudur: PostgreSQL gibi ilişkisel bir veritabanı verinin doğruluğunu ve kalıcılığını önceler, veriyi diske yazar. Redis ise hızı önceler. Diske erişim bellekten yüz binlerce kat yavaş olduğu için, sürekli okunan ama nadiren değişen verileri Redis'te tutmak uygulamanızın en pahalı darboğazını ortadan kaldırır. Kavramları tazelemek isterseniz deploy'un ne olduğunu anlatan yazımıza da göz atabilirsiniz.
Redis nerelerde kullanılır?
Redis'i tek bir işe hapsetmek yanlış olur. Pratikte en çok karşınıza çıkacak dört senaryo şunlardır.
Önbellek (cache). En klasik kullanım budur. Veritabanına giden yavaş sorguların sonucunu Redis'e yazar, aynı sonucu tekrar istendiğinde bellekten okursunuz.
Önbellek (cache), sık istenen verilerin geçici olarak hızlı erişilebilir bir katmanda tutulmasıdır. Redis bu katmanı bellekte oluşturur. Böylece uygulama aynı sorguyu her seferinde yavaş veritabanına göndermek yerine sonucu bellekten milisaniyeden kısa sürede okur.
Oturum saklama (session store). Birden fazla sunucu çalıştıran uygulamalarda kullanıcı oturumlarını tek bir sunucunun belleğinde tutamazsınız, çünkü sonraki istek başka sunucuya düşebilir. Oturumları Redis'te merkezi olarak saklar, her sunucunun aynı oturuma erişmesini sağlarsınız.
Hız sınırlama (rate limiting). Bir API'ye dakikada kaç istek geldiğini saymak için Redis'in atomik sayaçları biçilmiş kaftandır. Her istekte bir anahtarı artırır, süre dolunca sıfırlanacak şekilde ayarlarsınız.
İş kuyrukları (job queue). Ağır işleri (e-posta gönderimi, görsel işleme, rapor üretimi) isteğin içinde çalıştırmak yerine bir kuyruğa atar, arka planda çalışan işçiler bu kuyruktan tek tek çeker. Redis'in liste yapıları bu desen için idealdir.
Temel Redis veri tipleri
Redis'i basit bir anahtar değer deposundan ayıran şey, değerlerin farklı yapılar olabilmesidir. Sık kullanılan dördü şunlardır:
- String: En temel tip. Bir sayı, bir metin ya da serileştirilmiş bir JSON tutabilir. Önbellek ve sayaçlar çoğunlukla string üzerine kuruludur.
- Hash: Tek bir anahtar altında alan değer çiftleri saklar. Bir kullanıcı nesnesini (ad, e-posta, rol) tek hash içinde tutmak için uygundur.
- List: Sıralı bir eleman dizisidir. İki ucundan da ekleme çıkarma yapabildiğiniz için iş kuyruğu kurmanın en doğal yoludur.
- Set: Tekrar içermeyen elemanlar kümesidir. "Bir gönderiyi beğenen benzersiz kullanıcılar" gibi verilerde ve kesişim, birleşim işlemlerinde kullanılır.
Bunların yanında sıralı küme (sorted set), stream ve pub/sub gibi daha ileri yapılar da vardır. Tam listeyi Redis resmî dokümantasyonundan inceleyebilirsiniz.
Redis kalıcılık: RDB ve AOF
Redis verileri bellekte tuttuğuna göre, sunucu yeniden başladığında her şey uçar mı? Resmî redis:7 imajı varsayılan olarak aralıklı RDB anlık görüntüleri alır, bu yüzden yalnızca son anlık görüntüden sonraki yazımlar kaybolabilir; AOF ise varsayılan olarak kapalıdır. Redis iki kalıcılık mekanizması sunar ve ikisini de açabilirsiniz.
RDB (Redis Database), belirli aralıklarla belleğin anlık bir görüntüsünü tek bir dosyaya kaydeder. AOF (Append Only File) ise veriyi değiştiren her komutu bir günlük dosyasına ekler. RDB hızlı yedek ve yeniden başlatma sağlar, AOF ise en az veri kaybı ile daha güçlü dayanıklılık sunar.
Pratikte tercih ihtiyacınıza bağlıdır. Redis'i yalnızca önbellek olarak kullanıyorsanız, veri kaybının önemi yoktur ve kalıcılığı tamamen kapatabilirsiniz. Redis'te kaybetmek istemediğiniz oturum ya da kuyruk verisi tutuyorsanız, AOF'yi appendonly yes ile açmanız gerekir. İki mekanizmanın ayrıntılarını Redis kalıcılık dokümanında bulabilirsiniz.
Docker ile Redis nasıl çalıştırılır?
Redis'i denemenin en temiz yolu resmî redis imajını Docker ile çalıştırmaktır. Docker'ın ne olduğunu daha önce görmediyseniz, kısaca uygulamaları izole bir kap içinde çalıştıran bir teknoloji diyebiliriz.
Üç şeye dikkat etmelisiniz: verinin kaybolmaması için kalıcı bir birim (volume), yetkisiz erişimi engellemek için bir parola ve kalıcılık için AOF. Üçünü de tek komutta ayarlayabilirsiniz:
docker run -d --name redis \
-v redis-data:/data \
redis:7 redis-server \
--appendonly yes \
--requirepass "cok-guclu-bir-parola"Burada -v redis-data:/data satırı, Redis'in kalıcılık dosyalarını yazdığı /data dizinini adlandırılmış bir birime bağlar, böylece kap silinse bile veriniz durur. --appendonly yes AOF kalıcılığını açar. --requirepass ise parolayı zorunlu kılar. Parolasız bir Redis'i asla ağ üzerinde açık bırakmayın; internete bakan parolasız Redis örnekleri en sık ele geçirilen hedeflerden biridir.
Container içinden bağlanıp doğrulamak için:
docker exec -it redis redis-cli -a "cok-guclu-bir-parola" ping
# PONGResmî imajın seçenekleri ve etiketleri için Docker Hub Redis sayfasına bakabilirsiniz.
Out Plane'de Redis: dürüst durum
Burada net konuşmak isterim, çünkü yanlış beklenti kimseye fayda getirmez. Out Plane'in yönetilen veritabanı yalnızca PostgreSQL'dir. Yedekleme, belirli bir ana geri dönüş (point-in-time recovery), okuma kopyaları, bağlantı havuzu ve pgvector gibi özelliklerin hepsi PostgreSQL tarafındadır. Yönetilen bir Redis hizmeti yoktur.
Peki Out Plane üzerinde Redis çalıştıramaz mısınız? Çalıştırırsınız. Redis'i, yukarıda anlatılan resmî imajı temel alan sıradan bir uygulama gibi dağıtırsınız. Küçük bir Dockerfile yeterlidir:
FROM redis:7
CMD redis-server --appendonly yes --requirepass "$REDIS_PASSWORD"Parolayı ortam değişkeni olarak platformdan verir, kalıcı bir birim bağlar ve bu servisi özel ağda tutarsınız. Böylece Redis'e yalnızca aynı takımdaki uygulamalarınız erişir; dışarıya açılan bir {name}-{port}-{teamSlug}.outplane.app adresi almaz. Uygulamanız Redis'e özel ağ üzerinden, kendi iç adı ve 6379 portu üzerinden bağlanır. Kalıcı birimler ve özel ağ Out Plane'de mevcuttur, dolayısıyla üretimde çalıştıracak altyapı tamamdır.
Önemli fark şudur: bu Redis'i siz işletirsiniz. Sürüm güncellemesi, bellek limitleri, yedeklerin alınması ve izlenmesi sizin sorumluluğunuzdadır. Yönetilen bir hizmette bunları sağlayıcı üstlenir. İki yaklaşımı yan yana koyalım.
| Konu | Yönetilen Redis | Self-host Redis (Out Plane container) |
|---|---|---|
| Kurulum | Sağlayıcı hazır sunar | Dockerfile ile siz dağıtırsınız |
| Güncelleme ve yama | Sağlayıcı yapar | Siz yaparsınız |
| Yedekleme | Otomatik, hazır | Siz kurar ve doğrularsınız |
| Ölçekleme | Panelden ayarlanır | Kap kaynaklarını siz belirlersiniz |
| Kalıcılık ayarı | Sınırlı ama hazır | RDB, AOF üzerinde tam kontrol |
| Maliyet | Genelde daha yüksek | Yalnızca kullandığınız kaynak |
| Sorumluluk | Sağlayıcıda | Sizde |
| Veri konumu | Sağlayıcıya bağlı | EU bölgesinde tutabilirsiniz |
Not: Out Plane bir Delaware (ABD) şirketidir. Verinizi Nürnberg ya da Helsinki gibi bir EU bölgesinde tutmayı seçebilirsiniz, bu bir konum tercihidir. Bu, bir hukuki yargı yetkisi ya da sertifika iddiası değildir. Yalnızca verinizi hangi bölgede barındıracağınıza karar verirsiniz.
Kendi Redis'inizi yönetmek istemez ve verilerinizi kalıcı, güvenilir bir zeminde tutmak isterseniz, çoğu senaryoda yönetilen PostgreSQL tek başına yeterli olur. Redis'i ise hız kritik olan yerde bir hızlandırıcı katman olarak eklersiniz. Konteyner tabanlı bu düzenin altında yatan orkestrasyon mantığını merak ediyorsanız, Kubernetes'in ne olduğunu anlatan yazımız iyi bir başlangıç olur. Sunucu tercihinin temellerini ise bulut sunucu rehberimizde bulabilirsiniz.
Sıkça Sorulan Sorular
Redis bir veritabanı mı yoksa önbellek mi?
İkisi de olabilir. Redis teknik olarak bellek içi bir veri deposudur ve hem kalıcı bir veritabanı gibi hem de geçici bir önbellek gibi kullanılabilir. Uygulamada çoğu ekip onu önbellek, oturum deposu ve kuyruk olarak kullanır; asıl kalıcı veriyi ise PostgreSQL gibi ilişkisel bir veritabanında tutar.
Redis verileri kalıcı mı yoksa yeniden başlatınca kaybolur mu?
Varsayılan olarak veriler bellekte durur ve kalıcılık kapalıysa yeniden başlatmada kaybolur. RDB anlık görüntü ya da AOF komut günlüğünü açarsanız, Redis verileri diske yazar ve yeniden başlatınca geri yükler. Kaybetmek istemediğiniz veri varsa en azından AOF'yi açmanız gerekir.
Redis ile PostgreSQL arasındaki fark nedir?
PostgreSQL diske yazan, ilişkisel ve dayanıklılığı önceleyen bir veritabanıdır; asıl verinizin kalıcı evi burasıdır. Redis ise belleği önceleyen, çok hızlı ama sınırlı sorgu gücü olan bir depodur. İkisi rakip değil tamamlayıcıdır: kalıcı veri PostgreSQL'de durur, sık okunan sıcak veri Redis'te önbelleğe alınır.
Redis için ne kadar RAM gerekir?
Redis tüm veri kümesini bellekte tuttuğu için, saklamak istediğiniz veri kadar RAM'e ihtiyaç duyarsınız, üstüne biraz da işletim payı. Yalnızca önbellek olarak kullanıyorsanız küçük bir bellekle başlayıp, maxmemory sınırı ve bir çıkarma (eviction) politikası tanımlayarak Redis'in eski verileri otomatik atmasını sağlayabilirsiniz.
Out Plane yönetilen Redis sunuyor mu?
Hayır. Out Plane'in yönetilen veritabanı yalnızca PostgreSQL'dir. Redis'i, resmî imajı temel alan sıradan bir konteyner olarak kendiniz dağıtır ve işletirsiniz. Kalıcı birim bağlar, parola tanımlar ve özel ağda tutarsınız. Güncelleme, yedekleme ve izleme sizin sorumluluğunuzda olur.
Redis'i Docker ile kalıcı hale nasıl getiririm?
Kabı çalıştırırken /data dizinini adlandırılmış bir birime bağlayın ve --appendonly yes ile AOF'yi açın. Böylece Redis tüm yazma komutlarını bu dizindeki günlük dosyasına ekler ve birim kap silinse bile korunduğu için, yeni kap aynı birimle başladığında veriler geri yüklenir.
Redis'e parola koymak zorunda mıyım?
Yalnızca aynı makinede, tamamen izole bir ağda deneme yapıyorsanız parolasız çalışabilir. Ancak başka servislerin eriştiği ya da özel ağda bile paylaşılan her kurulumda --requirepass ile parola tanımlamanız şarttır. Parolasız ve dışa açık Redis örnekleri, saldırganların en hızlı ele geçirdiği hedeflerin başında gelir.
RDB mi AOF mi kullanmalıyım?
Sadece önbellek çalıştırıyorsanız hiçbirine gerek yok, kapalı bırakın. Yeniden başlatmada hızlı toparlanma ve düzenli yedek istiyorsanız RDB uygundur. En az veri kaybı önemliyse AOF daha güvenlidir. Çoğu üretim kurulumu ikisini birlikte açar: RDB hızlı geri yükleme, AOF ise dayanıklılık için.
Sonuç
Redis nedir sorusunun özü tek cümleyle şudur: hızın kritik olduğu yerde devreye giren, bellek içi çalışan çok yönlü bir veri deposu. Önbellek, oturum, hız sınırlama ve kuyruk ihtiyaçlarınızı sadeleştirir, ancak asıl kalıcı verinizin evi olmaz. Doğru mimari, kalıcı veriyi yönetilen PostgreSQL'de tutmak ve Redis'i onun önüne bir hızlandırıcı katman olarak eklemektir.
Denemeye başlamak için console.outplane.com üzerinden bir hesap açın. Kalıcı PostgreSQL veritabanınızı birkaç tıkla oluşturur, Redis'i ise resmî imajdan kendi konteyneriniz olarak dağıtırsınız. Kalıcı Hobby katmanı ücretsizdir ve kart istemeden 20 dolarlık deneme kredisi tanımlanır; ölçeklendiğinizde Pro tarafında yalnızca kullandığınız kadar ödersiniz. Güncel ayrıntılar için /pricing sayfasına göz atın.