Cloud & IT Cert Prep · Ders

Oturum Depolama ve Liderlik Tablosu Örüntüleri

HTTP oturum durumunu uygulama sunucularınızdan ayırmak için ElastiCache kullanın ve Redis sıralı kümeleriyle gerçek zamanlı liderlik tabloları uygulayın.

4. ders / 413 adım

Oturum Depolama ve Liderlik Tablosu Örüntüleri, CoddyKit'te ücretsiz bir Cloud & IT Cert Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Cloud & IT Cert Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Cloud & IT Cert Prep kursu toplamda 4 dersten oluşur.

Sunucu Tarafı Oturumlarla İlgili Sorun

Geleneksel web uygulamaları oturum verilerini sunucunun belleğinde depolar. Bu yöntem tek bir sunucuyla çalışır, ancak yatay olarak ölçeklendirdiğinizde sorun çıkarır; kullanıcının sonraki isteği farklı bir EC2 bulut sunucusuna yönlendirilirse bu bulut sunucusu kullanıcının oturumundan haberdar olmaz ve kullanıcının oturumu kapatılır. Yapışkan oturumlar (yük dengeleyicideki oturum bağlılığı) bu sorunu kısmen çözer, ancak yük dengelemenin etkinliğini azaltır. Ölçeklenebilir çözüm, oturum durumunu tüm bulut sunucularının erişebildiği paylaşılan, düşük gecikmeli bir depoya taşımaktır; ElastiCache Redis tam olarak bunu sağlar.

Oturum Depolama için Redis

Oturumları Redis'te depolamak size şunları sağlar: tüm uygulama sunucularında milisaniyenin altında oturum okumaları, oturumların otomatik olarak sona ermesi için yerleşik TTL, yarış koşullarını önlemek üzere atomik oturum güncellemeleri ve anahtarı silerek bir oturumu hemen geçersiz kılma olanağı. Uygulama, oturum kimliğini bir çerezde depolar; her istekte oturum verilerini almak için Redis'te oturum kimliğini arar. Tüm uygulama sunucuları aynı Redis'i paylaşır, bu nedenle herhangi bir sunucu herhangi bir kullanıcının isteğini işleyebilir.

# Session storage with Redis (Python Flask example)
import redis, json, uuid
from datetime import timedelta

redis_client = redis.Redis(host='prod-redis-primary', port=6379)
SESSION_TTL = int(timedelta(hours=8).total_seconds())

def create_session(user_id):
    session_id = str(uuid.uuid4())
    session_data = {'user_id': user_id, 'logged_in': True}
    redis_client.setex(f'session:{session_id}', SESSION_TTL, json.dumps(session_data))
    return session_id

def get_session(session_id):
    data = redis_client.get(f'session:{session_id}')
    return json.loads(data) if data else None

Oturum TTL'si ve Kayan Süre Dolumu

Sabit bir TTL, etkinlikten bağımsız olarak oturumun oluşturulmasından N saniye sonra sona ermesi anlamına gelir. Kayan TTL (her erişimde sona erme süresini uzatma) kullanıcılar için daha uygundur; oturum son erişimden N saniye sonra sona erer. Redis'te kayan TTL uygulamak için her başarılı oturum okumasında oturum anahtarında EXPIRE (veya EXPIREAT) çağrısı yaparak sona erme geri sayımını sıfırlayın. Böylece etkin kullanıcıların oturumu beklenmedik biçimde kapatılmaz; etkin olmayan oturumların süresi otomatik olarak dolar ve bellek serbest bırakılır.

# Sliding TTL session implementation
def get_session_with_sliding_ttl(session_id, redis_client, ttl_seconds=1800):
    session_key = f'session:{session_id}'

    # Pipeline: GET + EXPIRE in one round trip
    pipe = redis_client.pipeline()
    pipe.get(session_key)
    pipe.expire(session_key, ttl_seconds)  # Reset TTL on access
    results = pipe.execute()

    data = results[0]
    if data:
        return json.loads(data)
    return None   # Session expired or not found

Redis'te Alışveriş Sepeti

Bir e-ticaret alışveriş sepeti Redis için doğal bir kullanım alanıdır. Her sepet, alanı ürün SKU'su ve değeri miktar olan bir Redis Hash olarak depolanır. HINCRBY ve HDEL gibi Hash işlemleri, sepetin tamamını alıp yeniden yazmadan atomik güncellemelere olanak tanır. Redis, terk edilmiş sepetlerin 24 saat sonra süresinin dolması için bir TTL ile birleştirildiğinde her sepete ekleme olayı için ilişkisel veritabanı kullanmanın ek yükü olmadan hızlı ve kalıcı bir sepet deposu sağlar.

# Shopping cart operations using Redis Hash
cart_key = f'cart:{user_id}'

# Add item (or increase quantity)
# HINCRBY cart:user42 SKU-001 2
redis_client.hincrby(cart_key, 'SKU-001', 2)

# Remove item
# HDEL cart:user42 SKU-001
redis_client.hdel(cart_key, 'SKU-001')

# Get all items in cart
# HGETALL cart:user42
cart = redis_client.hgetall(cart_key)  # {b'SKU-001': b'2', b'SKU-002': b'1'}

# Set TTL for cart abandonment (24 hours)
redis_client.expire(cart_key, 86400)

Sıralama Tablosu Mimarisi

Gerçek zamanlı bir sıralama tablosu, Sorted Set'ler (ZSET'ler) tarafından desteklenen klasik bir Redis kullanım alanıdır. Her oyuncu girdisinin bir puanı vardır; sıralı küme, üyeleri her zaman artan puan sırasına göre tutar. Sıralama tablosu sorguları (ilk N oyuncu, oyuncu sırası, belirli bir puan aralığındaki oyuncular) O(log n) veya O(log n + m) karmaşıklığındadır; bu nedenle milyonlarca oyuncu için bile son derece hızlıdır. Redis sıralı kümeleri, her sayfa görüntülemesinde karmaşık bir veritabanı sorgusuna veya sıralamayı yeniden hesaplamaya gerek kalmadan pek çok oyun, fitness ve sosyal sıralama özelliğinin temelini oluşturur.

# Real-time leaderboard with Redis Sorted Set

# Add or update a player's score
# ZADD game:weekly:leaderboard 15750 'player:alice'
redis_client.zadd('game:weekly:leaderboard', {'player:alice': 15750})

# Increment score (atomic)
# ZINCRBY game:weekly:leaderboard 500 'player:alice'
redis_client.zincrby('game:weekly:leaderboard', 500, 'player:alice')

# Get top 10 players (highest scores first)
# ZREVRANGE game:weekly:leaderboard 0 9 WITHSCORES
top_10 = redis_client.zrevrange('game:weekly:leaderboard', 0, 9, withscores=True)

Oyuncu Sırası ve Yakındaki Oyuncular

“İlk 10'u göster” özelliğinin ötesindeki iki yaygın sıralama tablosu özelliği, bir oyuncunun sırasını gösterme ve belirli bir oyuncunun yakınındaki oyuncuları gösterme özellikleridir. Her ikisi de Redis sıralı kümeleriyle son derece kolaydır. ZREVRANK, azalan puan sırasındaki bir oyuncunun 0 tabanlı sırasını döndürür. Bir oyuncunun üstündeki ve altındaki 5 oyuncuyu göstermek için önce oyuncunun sırasını alın, ardından sıra-5 ile sıra+5 arasındaki aralık için ZREVRANGE kullanın. Böylece karmaşık SQL pencere işlevlerine gerek kalmadan iki Redis komutuyla kişiselleştirilmiş bir sıralama tablosu görünümü elde edersiniz.

# Get Alice's rank (0-indexed, so add 1 for display)
# ZREVRANK game:weekly:leaderboard 'player:alice'
rank = redis_client.zrevrank('game:weekly:leaderboard', 'player:alice')
print(f'Alice is rank #{rank + 1}')

# Get 5 players above and below Alice
start = max(0, rank - 5)
end = rank + 5
nearby = redis_client.zrevrange(
    'game:weekly:leaderboard', start, end, withscores=True
)
print('Players near Alice:', nearby)

Redis ile İstek Hızı Sınırlama

İstek hızı sınırlama (bir istemcinin belirli bir zaman aralığında yapabileceği istek sayısını kısıtlama), Redis'in bir başka değerli kullanım alanıdır. Kayan pencere algoritması, her üyesi bir istek zaman damgası olan sıralı bir küme kullanır. Her istekte şu işlemler yapılır: pencereden daha eski üyeleri kaldırın, kalan üyeleri sayın, sayı sınırı aşıyorsa isteği reddedin ve yeni zaman damgasını ekleyin. Bu yöntem, milisaniye çözünürlüğüyle hassas kayan pencere üzerinden istek hızı sınırlaması sağlar; sabit pencere sayaçlarından çok daha doğrudur ve veritabanı yükü oluşturmaz.

# Sliding window rate limiter (100 requests per 60 seconds)
import time

def is_rate_limited(user_id, redis_client, limit=100, window_seconds=60):
    key = f'ratelimit:{user_id}'
    now = time.time()
    window_start = now - window_seconds

    pipe = redis_client.pipeline()
    pipe.zremrangebyscore(key, '-inf', window_start)  # Remove old
    pipe.zcard(key)                                    # Count current
    pipe.zadd(key, {str(now): now})                   # Add this request
    pipe.expire(key, window_seconds)
    results = pipe.execute()

    request_count = results[1]
    return request_count >= limit  # True = rate limited

Redis ile Dağıtık Kilitleme

Dağıtık kilitler, birden çok uygulama sunucusunun paylaşılan bir kaynağa özel erişimini koordine eder. Redis'in SET key value NX EX ttl komutu atomik kilit edinme olanağı sağlar: anahtarı yalnızca mevcut değilse ayarlar (NX = Not eXists) ve kilidi elinde tutan işlem çökerse kilitlenmelerin oluşmasını önlemek için bir TTL belirler. İşlem tamamlandığında kilidi elinde tutan taraf anahtarı siler. Redlock algoritması (çoğunluk sağlamak için birden çok Redis düğümü kullanır) daha sağlam bir dağıtık kilit sağlar; ancak karmaşıklığı artırır. Çoğu kullanım alanı için tek bir Redis düğümündeki kilit yeterlidir.

# Distributed lock with Redis SET NX EX
import uuid

def acquire_lock(redis_client, resource, ttl_seconds=30):
    lock_id = str(uuid.uuid4())  # Unique ID to identify this lock holder
    key = f'lock:{resource}'
    acquired = redis_client.set(key, lock_id, nx=True, ex=ttl_seconds)
    return lock_id if acquired else None

def release_lock(redis_client, resource, lock_id):
    key = f'lock:{resource}'
    # Only delete if we still own the lock (Lua script for atomicity)
    lua = 'if redis.call("get",KEYS[1])==ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end'
    redis_client.eval(lua, 1, key, lock_id)

Oturum Depolama: ElastiCache ve DynamoDB Karşılaştırması

Hem ElastiCache Redis hem de DynamoDB oturum verilerini depolayabilir; ancak aralarında farklı ödünleşimler vardır. ElastiCache Redis: mikrosaniye düzeyinde gecikme, bellek içi çalışma (kalıcılık etkinleştirilmedikçe geçici), daha basit veri modeli ve VPC gereksinimi. DynamoDB: tek haneli milisaniye düzeyinde gecikme (DAX, Redis ile aynı düzeye ulaşabilir), sürdürülecek küme gerektirmeyen tamamen yönetilen yapı, varsayılan olarak kalıcı depolama, Global Tables ile küresel erişim ve talep üzerine kapasiteyle sunucusuz çalışma. SAA-C03 sınavı için: soru mikrosaniye düzeyinde gecikmeyi veya karmaşık bellek içi işlemleri vurguluyorsa Redis'i seçin. Kalıcılığı, sunucusuz yapıyı veya küresel ölçeği vurguluyorsa DynamoDB'yi değerlendirin.

Redis ile Jeo-uzamsal Dizinleme

Redis, enlem/boylam koordinatlarını depolayan ve yakınlık sorgularını etkinleştiren yerleşik bir jeo-uzamsal veri türüne (GEO komutları) sahiptir. GEOADD, GEODIST ve (Redis 6.2'de artık GEOSEARCH olan) GEORADIUS komutlarını kullanarak belirli bir noktanın verilen yarıçapı içindeki tüm konumları O(n + log n) sürede bulabilirsiniz. Kullanım alanları: yakındaki sürücüleri bulma (araç paylaşımı), 5 km içindeki restoranları bulma ve arama sonuçlarını mesafeye göre sıralama. Bu yaklaşım, ayrı bir jeo-uzamsal veritabanı gereksinimini ortadan kaldırır ve konum sorgularını bellek içi hızlarda tutar.

# Store driver locations
# GEOADD drivers 13.361389 38.115556 'driver:001'
# GEOADD drivers 15.087269 37.502669 'driver:002'

# Find all drivers within 10 km of a point
# GEOSEARCH drivers FROMLONLAT 13.5 38.1 BYRADIUS 10 km ASC COUNT 5 WITHCOORD

# Result: sorted list of driver IDs within 10 km with coordinates

Benzersiz Ziyaretçi Sayımı için HyperLogLog

HyperLogLog, eklenen benzersiz öğe sayısından bağımsız olarak sabit miktarda bellek (Redis'te 12 KB) kullanarak bir kümedeki benzersiz öğelerin sayısını tahmin eden olasılıksal bir veri yapısıdır. Yaklaşık %0,81 standart hata sağlar. Öğeleri eklemek için PFADD, tahmini almak için PFCOUNT kullanın. Kesin sayımların gerekli olmadığı ve bellek verimliliğinin önemli olduğu durumlarda günlük etkin benzersiz kullanıcıları, benzersiz sayfa görüntülemelerini veya benzersiz IP adreslerini saymak için idealdir. Milyonlarca benzersiz kullanıcı kimliğini Redis Set olarak depolamak GB'larca alan tüketirken HyperLogLog yalnızca 12 KB kullanır.

# Count unique daily visitors using HyperLogLog
date = '2024-01-15'
hll_key = f'unique_visitors:{date}'

# Track a visitor (PFADD is idempotent for the same user)
# PFADD unique_visitors:2024-01-15 'user:12345'
redis_client.pfadd(hll_key, 'user:12345')
redis_client.pfadd(hll_key, 'user:67890')
redis_client.pfadd(hll_key, 'user:12345')  # Duplicate — not counted again

# Get estimated unique visitor count
# PFCOUNT unique_visitors:2024-01-15
count = redis_client.pfcount(hll_key)
print(f'Unique visitors today (estimate): {count}')

Hızlı Kontrol

Bu derste ele alınan AWS Solutions Architect (SAA-C03) kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: Redis oturum depolama, tüm örneklere milisaniyenin altında gecikmeyle paylaşılan oturum durumuna erişim sağlayarak durumsuz yatay ölçeklendirmeyi mümkün kılar; Redis sıralı kümeleri, O(log n) sıra sorgularıyla gerçek zamanlı sıralama tablolarını destekler; özelleştirilmiş Redis veri türleri (benzersiz sayımlar için HyperLogLog, yakınlık sorguları için GEO ve dağıtık kilitler), yaygın mimari sorunları verimli biçimde çözer. Böylece ElastiCache ile Önbelleğe Alma kursu tamamlanır; sırada Yüksek Kullanılabilirlik ve Hata Toleranslı Mimarileri inceleyeceğiz.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Cloud & IT Cert Prep öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
150
Dersler
600

Sıkça Sorulan Sorular

“Oturum Depolama ve Liderlik Tablosu Örüntüleri” dersi ücretsiz mi?

Evet — “Oturum Depolama ve Liderlik Tablosu Örüntüleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Cloud & IT Cert Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Cloud & IT Cert Prep kursu toplamda 4 dersten oluşur.

“Oturum Depolama ve Liderlik Tablosu Örüntüleri” dersinde ne öğreneceğim?

HTTP oturum durumunu uygulama sunucularınızdan ayırmak için ElastiCache kullanın ve Redis sıralı kümeleriyle gerçek zamanlı liderlik tabloları uygulayın. Cloud & IT Cert Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Cloud & IT Cert Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Cloud & IT Cert Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Oturum Depolama ve Liderlik Tablosu Örüntüleri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Cloud & IT Cert Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Cloud & IT Cert Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Redis ve Memcached: Doğru Motoru Seçme
  2. ElastiCache Redis Çoğaltma Grupları ve Küme Kipi
  3. Önbellekleme Stratejileri: Tembel Yükleme ve Yazma Üzerinden Geçirme
  4. Oturum Depolama ve Liderlik Tablosu Örüntüleri
← Cloud & IT Cert Prep Sayfasına Dön