Redis'i ilk öğrenmeye başladığımda aklımdaki en büyük soru şuydu: 'Aynı anda binlerce kişi aynı uygulamayı kullanıyorsa, uygulama hangi verinin kime ait olduğunu nasıl biliyor?' Cevap sandığımdan daha basit, ancak tüm parçaları birleştirmem biraz zaman aldı. Bu yazıyı, bana anlatılmasını istediğim şekilde yazıyorum: sade Türkçe, açıklanmayan hiçbir jargon olmadan.
Tek cümleyle Redis nedir? Redis, uygulamanızın arka ucu ile veritabanınız arasında yer alan süper hızlı, geçici bir depolama kutusudur. Uygulamanız aynı soruyu (yavaş) veritabanına defalarca sormak yerine önce Redis'e sorar. Eğer Redis cevabı zaten saklıyorsa, anında yanıt verir. Bunu, en çok istenen 10 kitabı masasında tutan ve her istendiğinde arka rafa yürümek zorunda kalmayan bir kütüphaneci gibi düşünün.
Büyük soru: Redis hangi verinin hangi kullanıcıya ait olduğunu nasıl biliyor? Redis sihirli bir şekilde 'bilmez'. Sadece dev bir sözlüktür. Bir anahtar verirsiniz, size bir değer döndürür. İşte bu kadar. Asıl hile Redis'in kendisinde değil, arka uç kodunuzun anahtarları nasıl adlandırdığındadır. Her kullanıcı giriş yaptığında benzersiz bir kimlik alır (oturum kimliği, token vb.). Arka uç, bu kimliği kullanarak her veri parçası için benzersiz bir anahtar oluşturur: user:123:profile, user:123:cart, user:456:profile gibi. Kullanıcı 123 ve 456 asla birbirlerinin verilerine dokunmaz çünkü tamamen farklı anahtarlar altında saklanırlar, aynı Redis aynı anda her iki kullanıcı tarafından kullanılsa bile.
Teknik Analiz
Peki aynı sorunun farklı detaylarıyla karşılaşıldığında ne olur? Örneğin, bir kullanıcı 'siparişlerim'i soruyor, ancak bazen bekleyen siparişleri, bazen teslim edilenleri, bazen 1. sayfayı, bazen 2. sayfayı istiyor. Aynı 'işlem' olsa da farklı filtreler (sorgu parametreleri) var. Çözüm: filtreler de anahtarın bir parçası haline gelir. user:123:orders:status=pending, user:123:orders:page=1 gibi. Aynı kullanıcı, aynı işlem, ancak farklı filtreler farklı Redis girişleri anlamına gelir. Bir dahaki sefere aynı filtreler geldiğinde, arka uç aynı anahtarı yeniden oluşturur, önbelleğe alınmış yanıtı bulur ve yavaş veritabanı çağrısını tamamen atlar.
Uzun filtreler için kullanışlı bir numara: hash fonksiyonları. Çok sayıda filtre varsa anahtarlar karmaşık hale gelebilir. Bu nedenle yaygın bir numara, tüm filtreleri bir hash fonksiyonu (MD5 veya daha hızlı xxHash gibi) kullanarak kısa bir parmak izine sıkıştırmaktır. Aynı girdi her zaman aynı parmak izini üretir. Arka uç, yeni istekten parmak izini yeniden oluşturur ve Redis'te olup olmadığını kontrol eder. Bu parmak izi tamamen arka uç detayıdır; ön yüz bunu asla görmez, göndermez ve varlığını bilmesi gerekmez.
'Peki tüm web sitesi de önbelleğe alınmıyor mu?' Bu benim sonraki kafa karışıklığımdı. Kullanıcı arayüzü (düğmeler, düzen, renkler) her kullanıcı için aynı görünüyor; bu da Redis'te önbelleğe alınıyor mu? Hayır. Bu tamamen farklı bir sistem olan CDN (İçerik Dağıtım Ağı) tarafından yapılır. CDN, her ziyaretçi için aynı olan statik dosyaları (HTML, CSS, JavaScript, resimler) önbelleğe alır. Redis ise her kullanıcı için farklı olan kişisel verileri (sepetiniz, profiliniz, siparişleriniz) önbelleğe alır.
Hadi deneyelim: Redis ile Python. Redis hakkında okumak başka, kendiniz çalıştırmak çok daha öğretici. İlk adım Redis'i indirip kurmak. Mac'te Homebrew ile brew install redis ve brew services start redis komutlarıyla kurabilirsiniz. Ardından redis-cli ping komutuyla PONG yanıtı alırsanız Redis çalışıyor demektir. Temel komutları deneyin: SET user:123:name 'Vignesh' ve GET user:123:name. Ayrıca EXPIRE ile süreli önbellekleme yapabilirsiniz.
Sistem Güvenliği
Redis önbellekleme, doğru anahtar tasarımı ve gerektiğinde hash fonksiyonları kullanılarak, kullanıcı verilerini etkili bir şekilde ayırır ve hızlı erişim sağlar. Bu yazıda anlatılanları kendi projelerinizde uygulayarak performansı artırabilirsiniz. Unutmayın, Redis sadece bir araçtır; asıl güç, onu nasıl kullandığınızda gizlidir.
Kaynak: dev.to