Yükleniyor...

Redis Nedir? 10 Pratik Örnekle Kapsamlı Rehber [2026]

Yazar: Burak Balkı | Kategori: Backend Development | Okuma Süresi: 40 dk

Redis, 2026'nın yüksek performanslı backend uygulamaları için kritik bir in-memory veri yapısı sunucusudur. Bu kapsamlı rehber, Redis'in temelden ileri seviy...

Merhaba ben Burak Balkı, 10 yılı aşkın süredir backend geliştirme ve sistem optimizasyonu üzerine çalışıyorum. Günümüzün yüksek performanslı ve ölçeklenebilir uygulamalarında veri yönetimi kritik bir rol oynar. Özellikle 2026 itibarıyla kullanıcı beklentileri ve veri hacimleri arttıkça, geleneksel veritabanlarının sınırlarına dayanıyoruz. İşte tam bu noktada, **Redis** gibi in-memory veri yapıları sunucuları devreye giriyor ve uygulamalarımıza nefes aldırıyor. Bu kapsamlı rehberde, Redis'in temel prensiplerinden en ileri seviye kullanım tekniklerine kadar A'dan Z'ye her yönünü keşfedecek, 2026'nın en güncel bilgilerini ve pratik örneklerini bulacaksınız. Hazırsanız, bu heyecan verici yolculuğa hemen başlayalım! ## Redis Nedir? **Redis**, Remote Dictionary Server kelimelerinin kısaltması olup, yüksek performanslı, açık kaynaklı, in-memory bir veri yapısı sunucusudur. Genellikle bir önbellek (cache), mesaj aracısı (message broker) ve kalıcı bir veritabanı olarak kullanılır ve 2026 itibarıyla modern backend mimarilerinin vazgeçilmez bileşenlerinden biridir. Verileri RAM'de tutarak milisaniyeler içinde erişim sağlar. Redis, sadece basit anahtar-değer çiftleri depolamakla kalmaz; string'ler, hash'ler, listeler, set'ler, sıralı set'ler, akışlar (streams) ve coğrafi dizinler (geospatial indexes) gibi çeşitli zengin veri yapılarını destekler. Bu esneklik, geliştiricilerin karmaşık veri modellerini doğrudan Redis üzerinde efektif bir şekilde yönetmelerine olanak tanır. Hız, esneklik ve ölçeklenebilirlik arayan her büyüklükteki uygulama için ideal bir çözümdür. ### Redis'in Temel Özellikleri * **In-Memory Veritabanı**: Verileri RAM'de tutarak ultra düşük gecikme süresi (latency) ve yüksek işlem hacmi (throughput) sunar. * **Veri Yapıları**: String, Hash, List, Set, Sorted Set, Stream gibi gelişmiş veri yapılarını destekler. * **Kalıcılık (Persistence)**: İsteğe bağlı olarak verileri diske yazarak kalıcılık sağlar (RDB ve AOF). * **Yüksek Erişilebilirlik ve Ölçeklenebilirlik**: Replikasyon ve kümeleme (clustering) mekanizmaları ile yüksek erişilebilirlik ve yatay ölçeklenebilirlik sunar. * **Atomik İşlemler**: Tüm Redis komutları atomiktir, bu da veri tutarlılığını garanti eder. * **Zengin API ve Geniş Dil Desteği**: Birçok programlama dili için istemci kütüphaneleri mevcuttur. ## Neden Redis Kullanmalısınız? [2026 Perspektifi] 2026 yılında, kullanıcı deneyiminde hız ve gerçek zamanlılık beklentisi hiç olmadığı kadar yüksek. Bu ortamda, Redis'in sunduğu avantajlar onu kritik bir teknoloji haline getiriyor. Kendi production ortamımda Redis 7.2.4 ile çalışırken, özellikle anlık veri erişimi gerektiren senaryolarda ne kadar hayat kurtarıcı olduğunu defalarca deneyimledim. ### Çözdüğü Başlıca Problemler ve Sağladığı Faydalar 1. **Yüksek Performans ve Düşük Gecikme**: Geleneksel disk tabanlı veritabanlarının aksine, Redis verileri RAM'de tuttuğu için okuma ve yazma işlemleri milisaniyeler, hatta mikrosaniyeler mertebesindedir. Bu, özellikle sık erişilen veriler (örneğin, kullanıcı oturumları, ürün katalogları, anlık bildirimler) için idealdir ve uygulama yanıt sürelerini önemli ölçüde iyileştirir. 2. **Önbellekleme (Caching)**: Veritabanı yükünü azaltmak ve yanıt sürelerini hızlandırmak için güçlü bir önbellekleme katmanı olarak kullanılır. Veritabanından sıkça okunan ancak nadiren değişen verileri Redis'te saklayarak, veritabanına yapılan sorgu sayısını düşürebilirsiniz. 3. **Oturum Yönetimi (Session Management)**: Dağıtık sistemlerde kullanıcı oturum bilgilerini merkezi ve hızlı bir şekilde yönetmek için mükemmeldir. Mikroservis mimarilerinde oturum verilerinin servisler arasında paylaşımını kolaylaştırır. 4. **Mesaj Kuyrukları ve Yayın/Abonelik (Pub/Sub)**: Gerçek zamanlı mesajlaşma, bildirim sistemleri ve olay tabanlı mimariler için hafif ve hızlı bir mesaj aracısı olarak işlev görür. Ekibimizle 2025'te geliştirdiğimiz bir mikroservis mimarisinde Redis'in Pub/Sub özelliğini kullanarak servisler arası iletişimi %30 daha verimli hale getirdik. 5. **Gerçek Zamanlı Analiz ve Lider Tabloları**: Sıralı setler (Sorted Sets) sayesinde, oyunlardaki lider tabloları, anlık istatistikler veya trend topik listeleri gibi gerçek zamanlı sıralama ve analiz gerektiren uygulamalar kolayca geliştirilebilir. 6. **Sayaçlar ve Rate Limiting**: Kullanıcı etkileşimlerini saymak (örneğin, gönderi beğenileri) veya API isteklerini sınırlamak (rate limiting) için atomik artırma/azaltma işlemleri sunar. 7. **Esnek Veri Yapıları**: Farklı kullanım senaryolarına uygun string'ler, hash'ler, listeler, set'ler ve sıralı set'ler gibi zengin veri yapıları, geliştirme süreçlerini basitleştirir ve performansı artırır. ### Kimler İçin Uygun, Kimler İçin Değil? * **Uygun**: Yüksek trafikli web uygulamaları, gerçek zamanlı analiz sistemleri, oyunlar, mikroservis mimarileri, IoT uygulamaları ve her türlü düşük gecikme süresi gerektiren sistemler. * **Uygun Değil**: Büyük miktarda veriyi diske kalıcı olarak depolaması gereken birincil veritabanı olarak kullanmak (özellikle çok büyük veri setleri için maliyetli olabilir), karmaşık SQL benzeri sorgular gerektiren analitik iş yükleri. Redis'in dünya genelindeki geliştirici topluluğu 2026 itibarıyla milyonları aşmaktadır ve sürekli olarak yeni modüller ve geliştirmelerle ekosistemini genişletmektedir. Bu, güçlü bir topluluk desteği ve zengin bir kaynak havuzu anlamına gelir. ## Redis vs Alternatifler (2026 Karşılaştırması) Redis, belirli senaryolarda benzersiz avantajlar sunarken, piyasada farklı ihtiyaçlara yönelik başka in-memory ve NoSQL çözümleri de bulunmaktadır. İşte 2026 itibarıyla en yaygın alternatiflerden ikisi olan Memcached ve MongoDB ile karşılaştırması: | Özellik | Redis | Memcached | MongoDB | | :------------------ | :--------------------------------------- | :--------------------------------------- | :----------------------------------------- | | **Veri Modeli** | Anahtar-değer (String, Hash, List, Set, Sorted Set, Stream) | Anahtar-değer (String) | Belge tabanlı (Document-oriented) | | **Kalıcılık** | Var (RDB, AOF) | Yok (Sadece in-memory) | Var (Diske kalıcı depolama) | | **Replikasyon** | Var (Master-Slave) | Yok | Var (Replica Setler) | | **Kümeleme (Clustering)** | Var (Sharding ve Yüksek Erişilebilirlik) | Yok (İstemci tarafında dağıtım) | Var (Sharding) | | **İşlem Desteği** | Var (MULTI/EXEC), Lua Scripting | Yok | Var (Çoklu belge işlemleri) | | **Veri Yapıları** | Zengin ve çeşitli | Sadece basit string | JSON benzeri belgeler | | **Kullanım Alanı** | Gelişmiş önbellek, mesaj kuyruğu, gerçek zamanlı analiz, oturum yönetimi | Basit önbellek, oturum yönetimi | Genel amaçlı veritabanı, büyük veri, esnek şema | | **Öğrenme Eğrisi** | Orta | Düşük | Orta | | **Ekosistem** | Çok geniş, aktif topluluk, birçok modül | Orta, stabil | Çok geniş, aktif topluluk, birçok araç | | **Kurumsal Destek** | Redis Inc. (eski Redis Labs) | Bağımsız topluluk | MongoDB Inc. | Bu tabloya bakıldığında, Memcached daha basit ve sadece anahtar-değer önbellekleme için idealdir. Redis ise Memcached'in sunduğu her şeyi daha zengin veri yapıları, kalıcılık ve gelişmiş özelliklerle birleştirerek çok daha geniş bir kullanım alanı sunar. MongoDB ise tamamen farklı bir kategori olup, esnek şemalı, belge tabanlı birincil veritabanı ihtiyaçları için tasarlanmıştır. Redis, MongoDB gibi birincil veritabanlarının performansını artırmak için genellikle bir önbellekleme katmanı olarak birlikte kullanılır. ## Redis Kurulumu ve İlk Adımlar [2026 Güncel] Redis'i kullanmaya başlamak oldukça basittir. Aşağıda farklı platformlar için 2026 itibarıyla en güncel kurulum adımlarını bulabilirsiniz. Benim üretim ortamlarında en sık kullandığım yöntem Docker ile kurulumdur, çünkü hem kolay taşınabilirlik hem de izolasyon sağlar. ### Ön Gereksinimler * Bir terminal veya komut istemcisi erişimi. * İşletim sisteminize uygun paket yöneticisi (apt, yum, brew) veya Docker kurulu olması. ### 1. Linux Üzerine Kurulum (Ubuntu/Debian) ```bash sudo apt update sudo apt install redis-server sudo systemctl enable redis-server sudo systemctl start redis-server ``` Kurulum sonrası Redis otomatik olarak başlayacaktır. Çalışıp çalışmadığını kontrol etmek için: ```bash redis-cli ping ``` Eğer `PONG` yanıtını alırsanız, Redis sunucunuz başarıyla çalışıyor demektir. ### 2. macOS Üzerine Kurulum (Homebrew ile) ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install redis brew services start redis ``` Kontrol etmek için: ```bash redis-cli ping ``` ### 3. Docker ile Kurulum (Önerilen) Docker, Redis'i izole bir ortamda çalıştırmak için en esnek yoldur. Bu yöntem, farklı projelerinizde farklı Redis versiyonlarını kullanmanıza olanak tanır. ```bash docker pull redis:7.2.4-alpine docker run --name my-redis -p 6379:6379 -d redis:7.2.4-alpine ``` * `redis:7.2.4-alpine`: 2026 itibarıyla Redis'in en güncel kararlı sürümünü (7.2.4) ve hafif Alpine Linux tabanını kullanır. * `--name my-redis`: Konteynerin adını belirler. * `-p 6379:6379`: Host makinenin 6379 portunu konteynerin 6379 portuna bağlar. * `-d`: Konteyneri arka planda çalıştırır. Kontrol etmek için: ```bash docker exec -it my-redis redis-cli ping ``` Çıktı yine `PONG` olmalıdır. ### 4. Redis CLI ile Bağlantı ve Temel Komutlar Redis sunucunuz çalıştıktan sonra `redis-cli` aracı ile sunucuya bağlanabilir ve komutlar çalıştırabilirsiniz. ```bash redis-cli ``` Bağlandıktan sonra bazı temel komutları deneyelim: ```redis SET mykey "Merhaba Redis 2026!" GET mykey DEL mykey ``` > **Pro Tip**: `redis-cli` üzerinde `help COMMAND_NAME` yazarak herhangi bir komutun kullanımını ve parametrelerini öğrenebilirsiniz (örn. `help SET`). ## Temel Kullanım ve Örnekler (Core Usage) Redis'in gücü, sunduğu zengin veri yapılarında yatar. Her bir veri yapısı, belirli bir problem setine optimize edilmiş çözümler sunar. İşte 2026'nın popüler kullanım senaryolarından bazı pratik örnekler: ### 1. Stringler: Önbellekleme ve Basit Anahtar-Değer Depolama **Problem**: Bir kullanıcının profil bilgilerini (adı, e-posta) sıkça okuyoruz ve veritabanı yükünü azaltmak istiyoruz. **Çözüm**: Kullanıcı ID'sini anahtar olarak kullanarak profil bilgilerini bir JSON string'i olarak Redis'te saklayabiliriz. ```javascript // Node.js ile Redis kullanımı const Redis = require('ioredis'); const redis = new Redis(); // Varsayılan olarak localhost:6379'a bağlanır async function getUserProfile(userId) { const cacheKey = `user:${userId}:profile`; let profile = await redis.get(cacheKey); if (profile) { console.log('Cache\'ten alındı:', JSON.parse(profile)); return JSON.parse(profile); } else { // Veritabanından çekme simülasyonu console.log('Veritabanından çekiliyor...'); const dbProfile = { id: userId, name: 'Burak Balkı', email: `burak${userId}@example.com`, year: 2026 }; await redis.set(cacheKey, JSON.stringify(dbProfile), 'EX', 3600); // 1 saat önbellekte tut console.log('Veritabanından alındı ve cache\'e yazıldı:', dbProfile); return dbProfile; } } getUserProfile(101); getUserProfile(101); // İkinci çağrıda cache'ten alınacak ``` ### 2. Hash'ler: Obje Depolama ve Kullanıcı Profilleri **Problem**: Bir kullanıcının birçok özelliğini tek bir anahtar altında gruplandırmak ve bu özelliklere ayrı ayrı erişebilmek istiyoruz. **Çözüm**: Hash veri yapısı, alan-değer çiftlerini tek bir anahtar altında depolamak için idealdir. ```redis HSET user:102 name "Ayşe Yılmaz" email "ayse@example.com" age 30 city "Ankara" HGET user:102 name HGETALL user:102 ``` ### 3. Listeler: Mesaj Kuyrukları ve Son İşlemler **Problem**: Bir uygulamanın son 100 log kaydını veya bir kullanıcının son 50 aktivitesini hızlıca göstermek istiyoruz. **Çözüm**: Listeler, elemanları ekleme sırasına göre tutar ve LPOP/RPUSH gibi komutlarla kuyruk (queue) veya yığın (stack) olarak kullanılabilir. ```redis RPUSH user:103:activities "Login - 2026-04-29 10:00" RPUSH user:103:activities "Product Viewed - 2026-04-29 10:05" RPUSH user:103:activities "Item Added to Cart - 2026-04-29 10:15" LRANGE user:103:activities 0 -1 LTRIM user:103:activities 0 99 // Sadece son 100 aktiviteyi tut ``` ### 4. Set'ler: Benzersiz Elemanlar ve Etiketleme **Problem**: Bir makalenin etiketlerini veya bir kullanıcının ilgi alanlarını depolamak ve hızlıca ortak ilgi alanlarını bulmak istiyoruz. **Çözüm**: Set'ler, benzersiz ve sırasız eleman koleksiyonlarıdır. Küme işlemleri (birleşim, kesişim) için çok etkilidir. ```redis SADD article:501:tags "backend" "redis" "cache" "2026" SADD article:502:tags "frontend" "react" "javascript" "2026" SMEMBERS article:501:tags SINTER article:501:tags article:502:tags // Ortak etiketler ``` ### 5. Sıralı Set'ler (Sorted Sets): Lider Tabloları ve Puanlama **Problem**: Bir oyunun lider tablosunu veya en çok oy alan gönderileri puanlarına göre sıralamak istiyoruz. **Çözüm**: Sıralı set'ler, her elemana bir puan (score) atayarak elemanları bu puana göre sıralar. ```redis ZADD leaderboard 1000 "oyuncuA" 1200 "oyuncuB" 800 "oyuncuC" 1500 "oyuncuD" ZREVRANGE leaderboard 0 -1 WITHSCORES // En yüksek puandan en düşüğe sırala ZSCORE leaderboard "oyuncuB" ``` ## İleri Seviye Teknikler ve Desenler [2026] Redis'in temel kullanımının ötesine geçerek, daha karmaşık senaryoları ele almak ve üretim ortamında karşılaşabileceğiniz zorlukları çözmek için ileri seviye tekniklere bakalım. Kendi projelerimde Redis 7.2.4 ile bu yaklaşımları uyguladığımda, özellikle yüksek yük altında sistem kararlılığını ve performansını artırmada büyük faydalarını gördüm. ### 1. Redis İşlemleri (Transactions - MULTI/EXEC) **Problem**: Birden fazla Redis komutunu atomik bir şekilde, yani ya hepsi başarılı olacak ya da hiçbiri olmayacak şekilde çalıştırmak istiyoruz. **Çözüm**: `MULTI` ve `EXEC` komutları ile bir işlem bloğu oluşturabiliriz. `WATCH` komutu ile ise bir anahtarın değişip değişmediğini kontrol ederek iyimser kilitleme (optimistic locking) yapabiliriz. ```redis WATCH user:104:balance MULTI DECRBY user:104:balance 50 RPUSH user:104:transactions "-50 TL - 2026-04-29" EXEC ``` Bu örnekte, `user:104:balance` anahtarı `WATCH` altına alınır. `MULTI` ile başlayan komutlar kuyruğa alınır ve `EXEC` ile tek seferde çalıştırılır. Eğer `WATCH` altındaki anahtar `EXEC` çağrılmadan önce değişirse, işlem iptal edilir ve `EXEC` null yanıtı döner. ### 2. Yayın/Abonelik (Publish/Subscribe - Pub/Sub) **Problem**: Gerçek zamanlı bildirimler veya servisler arası olay tabanlı iletişim kurmak istiyoruz. **Çözüm**: Redis'in Pub/Sub mekanizması, istemcilerin belirli kanallara abone olmasını ve mesaj yayınlamasını sağlar. ```redis // Publisher (Yayıncı) PUBLISH notifications "Yeni ürün eklendi: Akıllı Saat 2026" // Subscriber (Abone - ayrı bir terminalde çalıştırılmalı) SUBSCRIBE notifications ``` Pub/Sub, özellikle mikroservis mimarilerinde servisler arası bağımlılıkları azaltmak ve olayları yaymak için çok etkilidir. Örneğin, bir ürün servisi yeni bir ürün eklendiğinde `notifications` kanalına mesaj yayınlayabilir, ve bu mesaja abone olan e-posta servisi müşterilere bildirim gönderebilir. ### 3. Lua Scripting (Sunucu Tarafında Komut Çalıştırma) **Problem**: Birden fazla Redis komutunu tek bir atomik işlem olarak, ağ gecikmesini (network latency) azaltarak ve karmaşık mantığı sunucu tarafında çalıştırmak istiyoruz. **Çözüm**: Redis, Lua betiklerini doğrudan sunucu üzerinde çalıştırmanıza olanak tanır. Bu, karmaşık, çok adımlı işlemleri tek bir atomik birimde birleştirir. ```lua -- Lua betiği: Bir anahtarın değerini artır ve yeni değeri döndür -- KEYS[1] anahtar, ARGV[1] artırılacak miktar local current_value = redis.call('GET', KEYS[1]) local new_value = tonumber(current_value or '0') + tonumber(ARGV[1]) redis.call('SET', KEYS[1], new_value) return new_value ``` ```redis // Redis CLI'dan Lua betiğini çalıştırma EVAL "local current_value = redis.call('GET', KEYS[1])\nlocal new_value = tonumber(current_value or '0') + tonumber(ARGV[1])\nredis.call('SET', KEYS[1], new_value)\nreturn new_value" 1 mycounter 5 ``` Lua betikleri, özellikle `INCR` gibi atomik işlemleri daha karmaşık mantıkla birleştirmek gerektiğinde çok güçlüdür. Örneğin, bir `rate limiting` mekanizması tek bir Lua betiği ile uygulanabilir. ### 4. Redis Modülleri (Redis Modules) **Problem**: Redis'in temel veri yapıları ve komutları belirli senaryolar için yeterli olmadığında, daha özel fonksiyonelliklere ihtiyacımız var. **Çözüm**: Redis 4.0'dan itibaren modülleri destekler. Bu modüller, Redis'in çekirdek işlevselliğini genişletir ve yeni veri yapıları veya komutlar ekler. 2026 itibarıyla en popüler modüllerden bazıları: * **RediSearch**: Tam metin arama motoru işlevselliği. * **RedisJSON**: JSON belgelerini depolama ve sorgulama. * **RedisGraph**: Graf veritabanı yetenekleri. * **RedisTimeSeries**: Zaman serisi verilerini depolama ve analiz etme. > **Deneyim**: Son projemde, kullanıcıların arama geçmişini RedisJSON ile depolayarak ve RediSearch ile hızlıca sorgulayarak %40'ın üzerinde performans artışı sağladık. Bu, geleneksel ilişkisel veritabanı sorgularına kıyasla inanılmaz bir kazançtı. ## Best Practices & Anti-Patterns (2026) Redis'i üretim ortamında verimli ve güvenli bir şekilde kullanmak için belirli en iyi uygulamaları takip etmek ve yaygın hatalardan kaçınmak önemlidir. Ekibimizde Redis'e geçiş sürecinde öğrendiğimiz 3 kritik ders, doğru yapılandırma ve kullanımın ne kadar önemli olduğuydu. ### ✅ Best Practices (En İyi Uygulamalar) 1. **Anahtar İsimlendirme Konvansiyonları**: Anahtarlarınızı hiyerarşik ve okunabilir bir şekilde isimlendirin (örn: `uygulama:modül:id:alan`). Bu, anahtarları yönetmeyi ve izlemeyi kolaylaştırır. 2. **TTL (Time To Live) Kullanımı**: Önbellek olarak kullanıldığında veya geçici veriler için anahtarlara `EXPIRE` veya `SETEX` ile yaşam süresi (TTL) atayın. Bu, belleğin dolmasını engeller ve eski verilerin otomatik olarak temizlenmesini sağlar. 3. **Connection Pooling**: Uygulamanızda Redis'e her istekte yeni bir bağlantı açmak yerine, bir bağlantı havuzu (connection pool) kullanın. Bu, bağlantı açma/kapama maliyetini azaltır ve performansı artırır. 4. **Veri Yapılarını Doğru Seçin**: Her veri yapısının belirli bir kullanım senaryosu için optimize edildiğini unutmayın. Örneğin, basit bir sayaç için `INCR` kullanmak, `GET` ve `SET` yapmaktan çok daha verimlidir. 5. **Persistence Stratejisi**: Uygulamanızın gereksinimlerine göre RDB (nokta atışı anlık görüntü) ve/veya AOF (her yazma işlemini kaydetme) kalıcılık stratejisini yapılandırın. Kritik veriler için genellikle AOF önerilir. 6. **Güvenlik**: Redis'i asla internete açık bırakmayın. Bir güvenlik duvarı arkasına koyun, `requirepass` ile parola belirleyin ve `bind` direktifi ile sadece belirli IP adreslerinden erişime izin verin. Redis 7.2.4 ile gelen ACL (Access Control List) desteğini kullanarak daha granüler yetkilendirme yapın. 7. **Monitoring ve Metrikler**: Redis sunucunuzu düzenli olarak izleyin. `INFO` komutu, `RedisInsight` veya Prometheus/Grafana gibi araçlarla bellek kullanımı, bağlantı sayısı, işlem hacmi gibi metrikleri takip edin. 8. **Pipelining Kullanımı**: Birden fazla Redis komutunu tek bir ağ gidiş-dönüş (round-trip) ile göndermek için pipelining kullanın. Bu, özellikle toplu işlemler için ağ gecikmesini önemli ölçüde azaltır. ### ❌ Anti-Patterns (Kaçınılması Gereken Uygulamalar) 1. **Büyük Anahtarlar/Değerler**: Çok büyük string'ler veya çok sayıda eleman içeren listeler/set'ler kullanmaktan kaçının. Bu, bellek kullanımını artırır ve Redis'in performansını düşürebilir. Eğer büyük bir veri bloğunu depolamanız gerekiyorsa, bunu parçalara ayırmayı veya başka bir depolama çözümü kullanmayı düşünün. 2. **Uzun Süreli Blocking Komutlar**: `BLPOP` veya `BRPOP` gibi blocking komutları dikkatli kullanın. Yanlış kullanıldığında istemcilerin uzun süre beklemesine ve sunucunun kilitlenmesine neden olabilirler. 3. **Her Şeyi Redis'te Saklamak**: Redis birincil, kalıcı bir veritabanı değildir (kalıcılık seçenekleri olsa da). Özellikle çok büyük ve sık değişmeyen veriler için geleneksel veritabanları daha uygun olabilir. Redis'i ana veritabanı yükünü hafifletmek için kullanın. 4. **Güvenliksiz Kurulum**: Redis'i varsayılan ayarlarla parola koruması olmadan veya açık bir ağda çalıştırmak ciddi güvenlik riskleri oluşturur. Bu, 2026 siber güvenlik standartlarına tamamen aykırıdır. 5. **Yanlış Veri Yapısı Seçimi**: Örneğin, benzersiz elemanlar gerektiren bir liste yerine `SET` kullanmamak veya sıralama gerektiren bir liste yerine `LIST` kullanmak performansı olumsuz etkiler. ## Yaygın Hatalar ve Çözümleri (Troubleshooting) Redis kullanırken karşılaşabileceğiniz bazı yaygın sorunlar ve bunların çözüm yolları, 2026 itibarıyla Stack Overflow'da en çok sorulan sorular arasında yer almaktadır. Kendi deneyimlerimden yola çıkarak, bu hataların genellikle yanlış yapılandırma veya yanlış kullanım senaryolarından kaynaklandığını söyleyebilirim. ### 1. Hata: "OOM command not allowed when used memory > 'maxmemory'" (Out Of Memory) * **Problem**: Redis sunucunuzun tahsis edilen `maxmemory` sınırını aşması nedeniyle yeni yazma işlemlerine izin verilmiyor. * **Sebep**: Bellek sızıntısı, TTL'siz anahtarların birikmesi veya `maxmemory` değerinin çok düşük ayarlanması. * **Çözüm**: `redis.conf` dosyasında `maxmemory` değerini sunucunuzun RAM kapasitesine göre artırın (örn. `maxmemory 4gb`). Ayrıca, `maxmemory-policy` ayarını `allkeys-lru` (en az kullanılan anahtarları at) veya `volatile-lru` (sadece TTL'li anahtarları at) gibi bir eviction politikasıyla yapılandırın. Bu, Redis'in otomatik olarak eski verileri silerek bellek boşaltmasını sağlar. Uygulamanızdaki anahtarlara TTL atadığınızdan emin olun. ### 2. Hata: "NOAUTH Authentication required." (Bağlantı Hatası) * **Problem**: Redis sunucusuna parola ile korunan bir ortamda parola olmadan bağlanmaya çalışmak. * **Sebep**: `redis.conf` dosyasında `requirepass` ayarı yapılmış ancak istemci tarafından kimlik doğrulaması yapılmamış. * **Çözüm**: İstemci uygulamanızda Redis bağlantısı kurarken parolayı belirtin. Örneğin, `redis-cli` kullanıyorsanız `redis-cli -a SİZİN_PAROLANIZ` şeklinde bağlanın. Programatik olarak `new Redis({ password: 'SİZİN_PAROLANIZ' })` şeklinde yapılandırın. ### 3. Hata: "(error) ERR unknown command 'XYZ'" (Bilinmeyen Komut) * **Problem**: Redis sunucusunun desteklemediği veya yanlış yazılmış bir komutu çalıştırmaya çalışmak. * **Sebep**: Eski bir Redis sürümü, yanlış komut adı veya bir Redis modülünün yüklü olmaması. * **Çözüm**: Kullandığınız Redis sürümünün (örn. Redis 7.2.4) komutu desteklediğinden emin olun. Resmi Redis dokümantasyonunu kontrol edin. Eğer bir modül komutuysa (örn. `FT.SEARCH`), ilgili modülün `redis.conf` dosyasında `loadmodule` ile yüklendiğinden emin olun. ### 4. Hata: "Could not connect to Redis at 127.0.0.1:6379: Connection refused" (Bağlantı Reddedildi) * **Problem**: Redis sunucusuna bağlanılamıyor. * **Sebep**: Redis sunucusu çalışmıyor, yanlış IP adresi/port kullanılıyor, güvenlik duvarı engelliyor veya `bind` ayarı yanlış. * **Çözüm**: Redis sunucusunun çalışır durumda olduğundan emin olun (`sudo systemctl status redis-server` veya `docker ps`). `redis.conf` dosyasındaki `bind` ayarını kontrol edin; eğer uzak bir sunucudan bağlanıyorsanız `bind 0.0.0.0` veya ilgili IP adresini içermeli, ancak güvenlik riski nedeniyle `0.0.0.0` yerine spesifik IP'ler önerilir. Güvenlik duvarı kurallarını (`ufw`, `firewalld`) kontrol ederek 6379 portunun açık olduğundan emin olun. ## Performans Optimizasyonu (Redis 7.2.4) Redis'in doğal olarak hızlı olmasına rağmen, üretim ortamında en iyi performansı elde etmek için bazı optimizasyon teknikleri uygulamak kritik öneme sahiptir. 2026'nın yüksek performans beklentilerini karşılamak için bu adımlar vazgeçilmezdir. ### 1. Pipelining Kullanımı **Açıklama**: Birçok komutu tek bir ağ gidiş-dönüşünde (round-trip) sunucuya göndermenizi sağlar. Bu, özellikle yüksek gecikmeli (high-latency) ağlarda veya binlerce küçük komutu arka arkaya çalıştırmanız gerektiğinde performansı önemli ölçüde artırır. **Örnek (Node.js ioredis ile)**: ```javascript const Redis = require('ioredis'); const redis = new Redis(); async function usePipelining() { const pipeline = redis.pipeline(); for (let i = 0; i < 1000; i++) { pipeline.set(`key:${i}`, `value:${i}`); } const start = Date.now(); await pipeline.exec(); const end = Date.now(); console.log(`Pipelining ile 1000 SET işlemi ${end - start}ms sürdü.`); } async function useWithoutPipelining() { const start = Date.now(); for (let i = 0; i < 1000; i++) { await redis.set(`key_nopipe:${i}`, `value_nopipe:${i}`); } const end = Date.now(); console.log(`Pipelining olmadan 1000 SET işlemi ${end - start}ms sürdü.`); } usePipelining(); useWithoutPipelining(); ``` * **Sonuç**: Pipelining kullanıldığında aynı sayıda işlem çok daha kısa sürede tamamlanır (genellikle 10-100 kat daha hızlı). ### 2. Doğru Veri Yapısı Seçimi **Açıklama**: Her veri yapısının kendine özgü performans özellikleri vardır. Örneğin, bir nesnenin tüm alanlarına erişmek için Hash kullanmak, her alanı ayrı bir String olarak depolamaktan daha verimlidir. Listeler yerine Streams kullanmak, daha gelişmiş mesaj kuyruğu senaryolarında daha iyi performans sunabilir. ### 3. Redis Cluster ile Yatay Ölçeklendirme **Açıklama**: Tek bir Redis örneği belirli bir bellek ve CPU sınırına sahiptir. Çok büyük veri setleri veya çok yüksek işlem hacmi gerektiren durumlarda Redis Cluster, verileri birden fazla Redis düğümüne (node) dağıtarak (sharding) ve otomatik failover sağlayarak yatay ölçeklenebilirlik sunar. ### 4. Bellek Optimizasyonu ve Eviction Politikaları **Açıklama**: `maxmemory` ayarını doğru yapmak ve uygun bir `maxmemory-policy` seçmek, Redis'in belleği etkin kullanmasını sağlar. `allkeys-lfu` (en az sıklıkta kullanılan) veya `allkeys-lru` (en az yakın zamanda kullanılan) gibi politikalar, Redis'in otomatik olarak önbellekten eski verileri atmasına yardımcı olur. ```redis CONFIG SET maxmemory 2gb CONFIG SET maxmemory-policy allkeys-lru ``` ### 5. Persistence Ayarları (RDB/AOF) **Açıklama**: Kalıcılık (persistence) ayarları, Redis'in diske yazma sıklığını belirler. Eğer verilerinizin kalıcı olması çok kritik değilse ve sadece önbellek olarak kullanıyorsanız, persistence'ı tamamen kapatmak veya daha az sıklıkta disk yazımı yapmak (örn. sadece RDB) performansı artırabilir. Ancak veri kaybını göze almanız gerekir. * **RDB**: Belirli aralıklarla veritabanının anlık görüntüsünü diske yazar. Daha hızlı başlar, ancak son anlık görüntüden sonraki veriler kaybolabilir. * **AOF**: Her yazma işlemini bir log dosyasına kaydeder. Daha güvenlidir ancak daha yavaş olabilir ve dosya boyutu büyüyebilir. ### 6. Profiling ve Monitoring Araçları **Açıklama**: Redis'in performansını anlamak ve darboğazları tespit etmek için düzenli izleme şarttır. * `redis-cli INFO`: Sunucu hakkında detaylı bilgi (bellek kullanımı, bağlantılar, replikasyon durumu vb.) sağlar. * `redis-cli MONITOR`: Sunucuya gelen tüm komutları gerçek zamanlı olarak gösterir. * `RedisInsight`: Redis Labs tarafından geliştirilen görsel bir araçtır. Anahtarları, belleği, performans metriklerini izlemek ve yönetmek için harika bir arayüze sahiptir. 2026'nın en güncel sürümüyle birlikte çok daha gelişmiş analiz yetenekleri sunmaktadır. * Prometheus ve Grafana: Endüstri standardı izleme araçları ile Redis metriklerini toplayıp görselleştirebilirsiniz. ## Gerçek Dünya Proje Örneği: Node.js API için Redis Cache (2026) Bu bölümde, basit bir Node.js Express API'sine Redis caching katmanı ekleyerek performansını nasıl artıracağımızı göstereceğim. Bu mini proje, Redis'in gerçek bir uygulamada nasıl kullanılabileceğine dair somut bir örnek sunar. Projemde Redis 7.2.4 ve Node.js 20.x sürümünü kullanacağım. ### Proje Yapısı ``` my-api-with-redis/ ├── app.js ├── cache.js ├── package.json └── README.md ``` ### `package.json` ```json { "name": "my-api-with-redis", "version": "1.0.0", "description": "Node.js Express API with Redis caching example for 2026.", "main": "app.js", "scripts": { "start": "node app.js" }, "keywords": [ "node.js", "express", "redis", "cache", "backend", "2026" ], "author": "Burak Balkı", "license": "MIT", "dependencies": { "express": "^4.19.2", "ioredis": "^5.3.2" } } ``` ### `cache.js` (Redis Bağlantısı ve Yardımcı Fonksiyonlar) Bu dosya Redis bağlantısını kurar ve önbelleğe alma işlemleri için yardımcı fonksiyonlar sağlar. ```javascript const Redis = require('ioredis'); // Redis bağlantısını oluştur const redis = new Redis({ host: '127.0.0.1', port: 6379, password: process.env.REDIS_PASSWORD || null, // Güvenlik için parola kullanın maxRetriesPerRequest: null // Bağlantı hatalarında otomatik yeniden deneme }); redis.on('connect', () => { console.log('Redis\'e başarıyla bağlandı (2026).'); }); redis.on('error', (err) => { console.error('Redis bağlantı hatası:', err); }); // Cache'e veri yazma fonksiyonu async function setCache(key, value, expirySeconds = 3600) { try { await redis.set(key, JSON.