Redis Kurulum ve Temel Veri Yapıları

Üretim ortamında bir web uygulaması geliştiriyorsunuz, kullanıcı sayısı artıyor ve veritabanı sorguları yavaşlamaya başlıyor. Her sayfa yüklemesinde aynı ürün listesini, aynı kullanıcı bilgilerini tekrar tekrar çekiyorsunuz. İşte tam bu noktada Redis devreye giriyor. Redis, in-memory çalışan bir veri yapısı sunucusudur ve doğru kullanıldığında uygulamanızın performansını dramatik biçimde artırabilir. Bu yazıda Redis’i sıfırdan kuracağız, temel konfigürasyonu yapacağız ve gerçek dünya senaryolarında kullanacağınız veri yapılarını detaylıca inceleyeceğiz.

Redis Nedir ve Neden Kullanmalısınız

Redis, “Remote Dictionary Server” kelimelerinin kısaltmasıdır. Verilerinizi RAM üzerinde sakladığı için geleneksel disk tabanlı veritabanlarından onlarca kat daha hızlı okuma/yazma işlemi gerçekleştirir. Saniyede 100.000’in üzerinde okuma/yazma operasyonu yapabilme kapasitesi, onu önbellek çözümleri arasında tartışmasız bir lider konumuna taşıyor.

Redis’i sadece bir önbellek olarak düşünmek hata olur. String, List, Hash, Set, Sorted Set gibi zengin veri yapıları sayesinde kuyruk sistemi, oturum yönetimi, gerçek zamanlı istatistik toplama ve pub/sub mesajlaşma gibi pek çok farklı kullanım senaryosunu karşılayabilir.

Kurulum

Ubuntu/Debian Üzerinde Redis Kurulumu

Ubuntu’da Redis kurulumu oldukça basittir. Ancak dağıtımın varsayılan paket deposundaki sürüm genellikle güncel olmayabilir. Resmi Redis paket deposunu ekleyerek her zaman güncel sürümü kurmanızı tavsiye ederim.

# Gerekli bağımlılıkları yükle
sudo apt update
sudo apt install -y lsb-release curl gpg

# Redis GPG anahtarını ekle
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

# Resmi Redis deposunu ekle
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

# Redis'i kur
sudo apt update
sudo apt install -y redis

# Servisi başlat ve sistem başlangıcında otomatik başlamasını sağla
sudo systemctl enable redis-server
sudo systemctl start redis-server

# Kurulumu doğrula
redis-cli ping

Eğer her şey yolunda gittiyse terminalde PONG yanıtını göreceksiniz.

RHEL/CentOS/Rocky Linux Üzerinde Redis Kurulumu

# EPEL deposunu ekle
sudo dnf install -y epel-release

# Redis'i kur
sudo dnf install -y redis

# Servisi başlat
sudo systemctl enable redis
sudo systemctl start redis

# Durum kontrolü
sudo systemctl status redis
redis-cli ping

Kaynak Koddan Derleme (İleri Seviye)

Bazı durumlarda özelleştirilmiş modüller veya en son geliştirici sürümü için kaynak koddan derleme gerekebilir:

# Derleme bağımlılıkları
sudo apt install -y build-essential tcl

# Redis kaynak kodunu indir
wget https://download.redis.io/redis-stable.tar.gz
tar -xzf redis-stable.tar.gz
cd redis-stable

# Derle ve test et
make
make test

# Sisteme kur
sudo make install

# Servis dosyası oluştur
sudo cp utils/redis_init_script /etc/init.d/redis_6379
sudo mkdir /etc/redis
sudo cp redis.conf /etc/redis/6379.conf

Temel Konfigürasyon

Redis’in yapılandırma dosyası /etc/redis/redis.conf veya /etc/redis.conf konumunda bulunur. Üretim ortamı için mutlaka düzenlenmeniz gereken kritik parametreler şunlardır:

# Konfigürasyon dosyasını düzenle
sudo nano /etc/redis/redis.conf

Dosya içinde değiştirmeniz gereken önemli direktifler:

  • bind 127.0.0.1: Varsayılan olarak sadece localhost’tan bağlantı kabul eder. Uzaktan erişim gerekiyorsa sunucunun IP adresini ekleyin ama asla 0.0.0.0 yapmayın üretim ortamında.
  • requirepass: Parola zorunluluğu ekler. Mutlaka güçlü bir parola belirleyin.
  • maxmemory: Redis’in kullanabileceği maksimum bellek miktarı. Örneğin maxmemory 2gb.
  • maxmemory-policy: Bellek dolduğunda hangi verilerin silineceğini belirler. allkeys-lru çoğu önbellek senaryosu için idealdir.
  • save: RDB anlık görüntü alma aralıkları. Saf önbellek kullanımında save "" ile devre dışı bırakabilirsiniz.
  • appendonly: AOF log dosyası. Veri kalıcılığı istiyorsanız yes yapın.

Konfigürasyonu uyguladıktan sonra servisi yeniden başlatın:

sudo systemctl restart redis-server
redis-cli -a 'parolanız' ping

Redis CLI ile Çalışma

Redis’in kendi komut satırı arayüzü olan redis-cli, günlük yönetim işlerinizin büyük bölümünü burada yapacaksınız demektir.

# Redis CLI'a bağlan
redis-cli

# Parola ile bağlan
redis-cli -h 127.0.0.1 -p 6379 -a 'parolanız'

# Sunucu bilgilerini görüntüle
redis-cli info

# Bellek kullanımını görüntüle
redis-cli info memory

# Aktif bağlantıları listele
redis-cli client list

# Gerçek zamanlı komut izleme (dikkatli kullanın, performans etkisi var)
redis-cli monitor

Temel Veri Yapıları

1. String (Metin)

String, Redis’in en temel veri türüdür. İsim yanıltıcı olmasın; sadece metin değil, sayılar ve binary veriler de bu yapıyla saklanabilir. Maksimum 512 MB veri tutabilir.

# Değer ata
SET kullanici:1001:ad "Ahmet Yılmaz"

# Değer oku
GET kullanici:1001:ad

# TTL (yaşam süresi) ile birlikte ata - 3600 saniye = 1 saat
SET oturum:abc123 "kullanici_verisi" EX 3600

# Değer yoksa ata (NX = Not eXists)
SET kilit:islem:456 "locked" NX EX 30

# Sayısal değerleri artır/azalt
SET ziyaretci:sayac 0
INCR ziyaretci:sayac
INCRBY ziyaretci:sayac 5
DECR ziyaretci:sayac

# Mevcut TTL'yi kontrol et
TTL oturum:abc123

# Birden fazla değeri aynı anda ata/oku
MSET urun:1:fiyat 99.90 urun:1:stok 150 urun:1:ad "Laptop"
MGET urun:1:fiyat urun:1:stok urun:1:ad

Gerçek Dünya Senaryosu: Bir e-ticaret sitesinde ürün sayfaları için veritabanı sorgusunu önbelleğe almak istiyorsunuz. Ürün verisi değişmediği sürece her istek için PostgreSQL’e gitmeye gerek yok. Ürünü Redis’e koyun, 10 dakika TTL verin ve trafiğiniz artsa bile veritabanınız rahat nefes alsın.

2. List (Liste)

List, sıralı eleman dizisidir. Çift yönlü bağlantılı liste yapısı sayesinde başa ve sona ekleme çok hızlıdır. Kuyruk sistemi ve iş kuyruğu implementasyonları için mükemmeldir.

# Listenin sağına eleman ekle (kuyruk mantığı)
RPUSH gorev:kuyrugu "rapor-olustur" "email-gonder" "cache-temizle"

# Listenin soluna eleman ekle (yığın mantığı)
LPUSH bildirimler:kullanici:1001 "Siparişiniz kargoya verildi"
LPUSH bildirimler:kullanici:1001 "Ödemeniz alındı"

# Belirli aralıktaki elemanları oku (0 = ilk, -1 = son)
LRANGE gorev:kuyrugu 0 -1
LRANGE bildirimler:kullanici:1001 0 4

# Listenin uzunluğunu öğren
LLEN gorev:kuyrugu

# Soldan eleman çıkar ve sil (tüketici pattern)
LPOP gorev:kuyrugu

# Bloklu POP - kuyrukta eleman yoksa bekle (worker pattern için ideal)
BLPOP gorev:kuyrugu 0

# Liste uzunluğunu sınırla - son 100 elemanı sakla
LTRIM log:sunucu1 0 99

Gerçek Dünya Senaryosu: Toplu email gönderme sistemi kuruyorsunuz. Kullanıcılar kayıt olduğunda veya sipariş verdiğinde email kuyruğuna görev ekliyorsunuz. Arka planda çalışan worker process BLPOP ile kuyruğu dinliyor ve gelen görevleri işliyor. Bu sayede email gönderimi ana uygulama akışını bloklamıyor.

3. Hash (Karma Yapı)

Hash, alan-değer çiftlerini bir arada tutan yapıdır. Veritabanındaki bir satırı veya bir nesneyi temsil etmek için idealdir.

# Hash oluştur ve alan ekle
HSET kullanici:2001 ad "Zeynep" soyad "Kaya" email "[email protected]" yas 28

# Tek alan oku
HGET kullanici:2001 ad

# Tüm alanları oku
HGETALL kullanici:2001

# Sadece alanları veya değerleri listele
HKEYS kullanici:2001
HVALS kullanici:2001

# Birden fazla alan oku
HMGET kullanici:2001 ad email

# Alan var mı kontrol et
HEXISTS kullanici:2001 telefon

# Sayısal alanı artır
HSET urun:3001 stok 500
HINCRBY urun:3001 stok -1

# Alan sil
HDEL kullanici:2001 yas

# Hash içindeki alan sayısı
HLEN kullanici:2001

Gerçek Dünya Senaryosu: Kullanıcı oturum verilerini saklıyorsunuz. Her oturum için kullanıcı kimliği, son giriş zamanı, sepetteki ürünler, dil tercihi gibi bilgileri ayrı String anahtarlar yerine tek bir Hash’te tutmak hem daha organize hem de bellek açısından daha verimlidir.

4. Set (Küme)

Set, benzersiz elemanlardan oluşan sırasız bir koleksiyondur. Tekrarlı veri girişi otomatik olarak engellenir. Küme işlemleri (birleşim, kesişim, fark) için oldukça güçlüdür.

# Set oluştur ve eleman ekle
SADD etiketler:makale:101 "linux" "redis" "veritabani" "performans"
SADD etiketler:makale:102 "redis" "python" "web" "performans"

# Eleman var mı kontrol et
SISMEMBER etiketler:makale:101 "redis"

# Tüm elemanları listele
SMEMBERS etiketler:makale:101

# Eleman sayısı
SCARD etiketler:makale:101

# Kesişim - her iki makalede de olan etiketler
SINTER etiketler:makale:101 etiketler:makale:102

# Birleşim - tüm benzersiz etiketler
SUNION etiketler:makale:101 etiketler:makale:102

# Fark - 101'de olup 102'de olmayan etiketler
SDIFF etiketler:makale:101 etiketler:makale:102

# Rastgele eleman seç (kaldırmadan)
SRANDMEMBER etiketler:makale:101

# Eleman sil
SREM etiketler:makale:101 "performans"

# Online kullanıcı takibi
SADD online:kullanicilar 1001 1002 1003
SISMEMBER online:kullanicilar 1001

Gerçek Dünya Senaryosu: Sosyal medya platformunda “ortak arkadaşlar” özelliği geliştiriyorsunuz. Her kullanıcının takip ettiği kişileri bir Set’te saklarsanız, iki kullanıcının ortak takip ettiği hesapları SINTER ile milisaniyeler içinde hesaplayabilirsiniz.

5. Sorted Set (Sıralı Küme)

Sorted Set, Set’in skor değeri eklenmiş halidir. Her eleman bir skor ile ilişkilendirilir ve elemanlar bu skora göre otomatik olarak sıralanır. Liderlik tabloları, öncelikli kuyruklar için biçilmiş kaftandır.

# Sıralı küme oluştur (puan, kullanıcı adı)
ZADD liderlik:oyun1 9850 "ahmet" 7200 "zeynep" 12100 "mehmet" 6500 "ayse"

# Skor aralığına göre listele (artan sıra)
ZRANGE liderlik:oyun1 0 -1 WITHSCORES

# Azalan sırayla listele (en yüksekten en düşüğe)
ZREVRANGE liderlik:oyun1 0 2 WITHSCORES

# Belirli bir üyenin sıralamasını bul
ZRANK liderlik:oyun1 "ahmet"
ZREVRANK liderlik:oyun1 "mehmet"

# Belirli bir üyenin skorunu öğren
ZSCORE liderlik:oyun1 "zeynep"

# Skoru artır
ZINCRBY liderlik:oyun1 500 "ahmet"

# Skor aralığına göre sorgula
ZRANGEBYSCORE liderlik:oyun1 7000 15000 WITHSCORES

# Eleman sayısı
ZCARD liderlik:oyun1

# Belirli skor aralığındaki eleman sayısı
ZCOUNT liderlik:oyun1 7000 15000

# Öncelikli görev kuyruğu
ZADD gorev:oncelik 1 "kritik-yedekleme" 5 "rapor-gonder" 10 "log-temizle"
ZPOPMIN gorev:oncelik  # En düşük skorlu (en öncelikli) görevi al

Gerçek Dünya Senaryosu: Oyun uygulamanızda haftalık liderlik tablosu gösteriyorsunuz. Her seviye geçişinde ZINCRBY ile kullanıcının skorunu güncelleyin. Üst 10’u göstermek için ZREVRANGE oyun:haftalik 0 9 WITHSCORES komutunu kullanın. Geleneksel veritabanında ORDER BY ile her seferinde tüm tabloyu taramak yerine bu işlemi O(log N) karmaşıklığıyla yapıyorsunuz.

Expire ve Key Yönetimi

Üretimde Redis kullanırken anahtar yönetimi kritik önem taşır. Kontrolsüz büyüyen anahtarlar belleği tüketir.

# Anahtara yaşam süresi ata (saniye cinsinden)
EXPIRE oturum:xyz789 1800

# Anahtara yaşam süresi ata (milisaniye cinsinden)
PEXPIRE gecici:veri 5000

# Unix timestamp ile sona erme tarihi belirle
EXPIREAT kampanya:yilbasi 1735686000

# Kalan süreyi sorgula
TTL oturum:xyz789
PTTL gecici:veri

# Süreyi kaldır (kalıcı yap)
PERSIST oturum:xyz789

# Pattern ile anahtar ara (üretimde dikkatli kullanın!)
KEYS kullanici:*
KEYS *:oturum:*

# Büyük veritabanlarında SCAN kullanın (production-safe)
SCAN 0 MATCH kullanici:* COUNT 100

# Anahtar var mı kontrol et
EXISTS kullanici:1001

# Anahtar sil
DEL oturum:xyz789

# Anahtarı yeniden adlandır
RENAME eskiad yeniad

# Anahtar tipini öğren
TYPE liderlik:oyun1

Üretim Ortamı için İpuçları

Teorik bilgiler güzel ama üretimde işler her zaman beklediğiniz gibi gitmez. Yıllar içinde edindiğim deneyimlerden bazı kritik noktaları paylaşayım:

Anahtar isimlendirme standardı belirleyin. Büyük bir ekiple çalışırken kaotik anahtar isimleri baş belası olur. nesne-tipi:id:alan formatı yaygın kabul görmüş bir standarttır. kullanici:1001:profil, urun:2001:stok gibi.

KEYS * komutunu üretimde asla kullanmayın. Bu komut tüm veritabanını tarar ve Redis’i blokladığı için servis kesintisine yol açabilir. Bunun yerine SCAN komutunu kullanın.

Bellek limitini her zaman ayarlayın. maxmemory ve maxmemory-policy direktiflerini ihmal etmeyin. Bellek dolduğunda Redis’in nasıl davranacağını önceden belirlemelisiniz.

Büyük değerlerden kaçının. Bir anahtarda megabyte’larca veri saklamak hem ağ hem bellek açısından sorunludur. Değeri parçalara bölün.

Pipeline kullanın. Çok sayıda Redis komutu göndermeniz gerektiğinde her birini ayrı ayrı göndermek yerine pipeline ile tek seferde göndermek gecikmeyi dramatik biçimde düşürür. Bu konuyu bir sonraki yazıda derinlemesine ele alacağım.

Slow log’u aktif tutun. Yavaş komutları tespit etmek için konfigürasyona slowlog-log-slower-than 10000 ekleyin (10ms üzeri komutları logla). SLOWLOG GET ile bu logları inceleyin.

# Anlık istatistikleri izle
redis-cli info stats | grep -E "total_commands|rejected|evicted"

# Bellek kullanım özeti
redis-cli info memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation"

# Slow log görüntüle
redis-cli slowlog get 10

Veritabanı Seçimi ve Namespace

Redis varsayılan olarak 0-15 arası 16 veritabanı sunar. Farklı uygulama modülleri için farklı veritabanları kullanılabilir, ancak Redis Cluster modunda bu özellik çalışmaz. Bu yüzden anahtar isimlendirme standardını veritabanı ayırımına tercih etmenizi öneririm.

# Veritabanı seç
redis-cli -n 1

# CLI içinden değiştir
SELECT 1

# Aktif veritabanındaki tüm anahtarları sil (dikkatli!)
FLUSHDB

# Tüm veritabanlarını sil (çok dikkatli!)
FLUSHALL ASYNC

Sonuç

Redis, doğru kullanıldığında altyapınıza inanılmaz bir hız kazandırır. Bu yazıda kurulumdan başlayarak String, List, Hash, Set ve Sorted Set yapılarını gerçek dünya senaryolarıyla inceledik. Her veri yapısının kendine özgü güçlü yönleri var; hangisini nerede kullanacağınızı bilmek Redis’ten maksimum verim almanızı sağlar.

String’i basit önbellekleme ve sayaçlar için, List’i kuyruk sistemleri için, Hash’i nesne saklamak için, Set’i benzersiz koleksiyonlar ve küme işlemleri için, Sorted Set’i ise sıralama ve öncelikli kuyruklar için kullanmayı alışkanlık haline getirin.

Bir sonraki yazıda Redis Persistence (RDB ve AOF), Replication, Sentinel ile yüksek erişilebilirlik konularını ele alacağız. Ayrıca uygulama tarafında Redis’i verimli kullanmak için Pipeline, Transaction ve Lua Script konularını da inceleyeceğiz. Sorularınız ve yorumlarınız için aşağıdaki yorum bölümünü kullanabilirsiniz.

Yorum yapın