Teknoloji ve Altyapı - Redis: Bellek içi çözümler
Redis: bellek içi çözümler
1) Redis'in uygun olduğu yerler
Redis, zengin veri yapılarına sahip yüksek hızlı bir bellek içi anahtar değeri depolamasıdır. Tipik senaryolar:- Önbellek (okuma/kenara, TTL, SWR) ve oturumlar.
- Sayaçlar ve kotalar: oran sınırlaması, dolandırıcılıkla mücadele, kampanya sınırları.
- Skor tabloları/derecelendirmeler (ZSet),'en iyi N "önerileri.
- Olay kuyrukları/otobüsler (Akışlar/PubSub), giden kutusu/gelen kutusu, retrays.
- Idempotence (TTL'li anahtarlar), de-dup webhooks.
- Geo (en yakın noktaları arayın), Bitmap (bayraklar, DAU).
- Takma adlar/belirteçler ve kısa ömürlü yetkilendirme önbellekleri.
Önemli: Nakit bakiyeleri ve kritik değişmezleri için, Redis sadece bir okuma hızlandırıcı veya DBMS/defterde bir "hakikat kaynağı'ile bir dergi/önbellek olarak kullanılır.
2) Veri yapıları ve bunların ne zaman uygulanacağı
String: değerler/sayaçlar ('INCRBY'), idempotent anahtarlar.
Hash: profil/yapılandırma kümeleri, "hafif" nesnelerin depolanması.
Liste: basit kuyruklar (ancak tekrar/ofset semantiği olmadan).
Set: benzersiz öğeler, veri tekilleştirme.
ZSet: hıza göre sıralama (leadboards, TTL calendar - "deferred" events).
Akış: tüketici grupları ile sabit kuyruklar, 'XREADGROUP'/replay - webhooks, CDC, retrays için.
Geo: 'GEOADD/GEORADIUS' - en yakın noktalar/tüccarlar.
Bitmap/Bitfield: bayrak serileri (güne göre girişler, DAU/WAU).
HyperLogLog: Yaklaşık Benzersiz (UU) bellekte ucuzdur.
Bloom/Cuckoo (modüller): hızlı kullanılabilirlik kontrolleri, kaynağa "MISS" azaltın.
- RedisJSON (JSON belgeleri), RediSearch (indeksleme/arama), RedisBloom (olasılıksal yapılar), TimeSeries (metrikler/toplamalar).
3) Anahtarlar, TTL ve bellek politikaları
Adlandırma ve segmentasyon:
tenant:{t}:domain:{d}:{entity}:{id}:v{schema} region={R} currency={C} lang={L}
Sürüm oluşturma ('vN'), yalnızca anlamlı boyutları içerir (bölge/para birimi/dil/kiracı).
Kiracı başına anahtar boşluklarını ayırın.
- Bir TTL matrisi (sn/dak/saat) kullanın, izdihamı önlemek için jitter (± %10-20) ekleyin.
- Kısayol tuşları için - refresh-ahead ve single-flight (one leader updates).
- 'allkeys-lru/lfu', TTL bağımlılığı olmayan paylaşılan bir önbellektir.
- 'volatile-lru/lfu' - sadece TTL ile tuşlar.
- 'tahliye' - taşma üzerine yazma hatası (kritik kuyruklar/sayaçlar için daha güvenli).
- Komut dosyası için seçin ve her zaman 'evicted _ keys'i izleyin.
4) İşlemler, boru hatları ve komut dosyaları
Boru hatları: RTT'yi azaltın, grup 10-100 ekipleri.
İşlemler (MULTI/EXEC) - Okumaları izole etmeyin, ancak toplu işlemi atomik olarak yürütün.
Optimum kilitleme: 'İZLE tuşu' - MULTI/EXEC - kontrol.
Lua komut dosyaları: sunucu tarafında atomik mantık (hız sınırı, kilitler, bileşik işlemler).
5) Kuyruklar ve otobüsler: Liste vs Akış
List + 'BRPOP' - basit, ancak tüketici grupları yok, ofset/tekrar oynatma, düşmelere karşı zayıf direnç.
Akış: 'XADD - XREADGROUP - XACK', retry-deadletter (N dakika içinde alınmaz), anahtarla bölümleme. PSP/KYC web kitapları, ertelenmiş ödemeler/bildirimler için önerilir.
Öncelik kuyrukları: Önceliğe göre birkaç akış, tüketiciler ilk etapta yüksekten "emiyorlar".
Ertelenmiş görevler: ZSet nerede skor = zaman damgası; Periyodik 'ZRANGEBYSCORE'şimdi ≤ Stream'e aktarıldı.
6) Yüksek kullanılabilirlik ve ölçeklenebilirlik
Replikasyon: master> replica (okuma ölçeği).
Sentinel: otomatik yük devretme ustası, keşif, istemci URI'leri.
Redis Cluster: 16384 yuvalı sharding, yatay ölçeklendirme. '{order: 123}' karma etiketlerinde birden çok yapı kullanan anahtarları sarın.
- Önbellek/oturumlar için - cluster/replica, 'client-side hashing' SDK desteklenir.
- Kuyruklar/akışlar için - çapraz yuva işlemlerini en aza indirin; Etki alanı anahtarlarına göre bölümleme.
7) Kalıcılık: RDB, AOF ve yedeklemeler
RDB (anlık görüntüler): daha hızlı, daha ekonomik; Son saniye/dakika kaybı riski.
AOF (dergi): daha az kayıp; 'everysec/always' modları. AOF sıkıştırma ve periyodik yeniden paketleme.
Hibrit: RDB + AOF - hızlı kurtarma + orta dereceli kayıplar.
Yedeklemeler: AOF'un nesne depolama alanına anlık görüntüleri ve kopyaları; Düzenli olarak kurtarma kontrol edin.
Kritik kuyruklar/idempotency için AOF 'everysec' + replication seçeneğini belirleyin.
8) Güvenlik ve uyumluluk
AUTH/ACL: uygulama başına roller, "tehlikeli" komutların yasaklanması ('FLUSHALL', 'KEYS').
TLS'den istemci-sunucu ve düğümler arası bağlantılara; Sabit çıkış-IP.
Ağ segmentasyonu: özel alt ağlar, SG/NACL; Yalnızca gerekli servislerden/ad alanlarından erişin.
Sırları kaydetmeyin; Redis'te PAN/PII - yalnızca belirteçler/türevler.
Anahtar komutları: 'KEYS'den kaçının -' SCAN 'kullanın.
9) Gözlemlenebilirlik ve SLO
Temel metrikler:- Gecikme (P95/P99), 'instantaneous _ ops _ per _ sec', 'connected _ clients'.
- Isabet oranı, evicted_keys, expired_keys.
- Bellek: kullanılmış, parçalanma oranı, RSS, ayırıcı istatistikleri.
- Çoğaltma gecikmesi, AOF/RDB frekansları ve boyutları, çatal süresi.
- Akışlar: PEL (bekleyen girişler listesi), teslimat gecikmesi, yeniden deneme sayısı.
- Redis P99 operasyonları ≤ 5-10 ms.
- Tahliye ≤ %1/saat (önbellek alanı).
- Akış teslimatı P99 ≤ 500 мс, yeniden deneme oranı <%2.
10) FinOps ve Kaynak Planlama
Bellek pahalıdır: $/GB aylık RAM'i ölçün ve istekleri origin/DB'ye kaydedin.
LFU, daha az hacimle daha iyi bir isabet sağlayabilir.
Görüntüler/büyük lekeler için - Redis değil: CDN + nesne depolamasını kullanın.
11) iGaming/fintech için desenler
11. 1 Hız sınırlaması (Lua)
Fikir: Pencere anahtarında 'INCRBY' + TTL; Lua atomik olarak sınırı kontrol eder ve artar.
lua
-- KEYS[1]=key ARGV[1]=limit ARGV[2]=ttlSec ARGV[3]=inc local cur = redis. call('INCRBY', KEYS[1], ARGV[3])
if cur == tonumber(ARGV[3]) then redis. call('EXPIRE', KEYS[1], ARGV[2]) end if cur > tonumber(ARGV[1]) then return {0, cur} else return {1, cur} end
11. 2 Talep idempotence
TTL 24h ile 'idemp: {request _ id}' anahtarı, değer - sonuç/durum. Operasyonu gerçekleştirmeden önce, varlığı kontrol ediyoruz.
11. 3 Liderlik tabloları
'ZINCRBY leaderboard: game: {g} score user: {u}' - 'ZREVRANGE... WITHSCORES'IN.
Bölgeye/kiracıya göre üst N için - bireysel ZSet veya önekler.
11. 4 PSP Webhooks Kuyruğu
'XADD psp: webhooks... Tüketici grubu 'XGROUP CREATE psp: webhooks g1 $'.
"Sıkışmış" mesajların PEL taraması ('XPENDING' - 'XCLAIM') yoluyla geri alınması.
11. 5 Ertelenmiş ödemeler
ZSet 'paout: due' (score = epoch) - işçi periyodik olarak bitmiş öğeleri veri tekilleştirme ile Stream 'paout: exec'e aktarır.
11. 6 Antifraud metre
'PFADD' (benzersiz) + 'INCR' (yoğunluk) + geo/ASN etiketlerinin kombinasyonu; Manuel doğrulamayı tetikler.
12) Bellek ve performansla çalışma
İstemci bağlantı havuzları; RTT'yi azaltın (canlı tutun).
Boru hatlarını bir komut paketine tercih edin.
Büyük tuşlara dikkat edin ('MEMORY USAGE', 'SCAN') - nesneleri bölmek daha iyidir.
Az sayıda alana sahip karma, birçok bireysel anahtardan daha ekonomiktir.
Kâr testlerle onaylanırsa io-threads'i (okuma ağırlıklı) etkinleştirin.
Prod sık sık 'FLUSHDB/ALL' kaçının; Güvenli silme için önekler ve 'UNLINK' aracılığıyla yönetin.
13) Çok kiracı ve izolasyon
Bireysel kümeler/örnekler veya kiracı başına mantıksal DB (yük küçükse).
Anahtar/bellek kotaları, bölünmüş ACL'ler.
Ad alanına göre anahtar ve metriklerdeki önekler.
14) Kilitleme ve tutarlılık
SET anahtar val NX PX = tl - basit mutex.
Redlock: dikkatli kullanın; Dağıtılmış kritik işlemler için, "gerçeğin kaynağına" (DB/ledger) ve idempotent işlemlere güvenmek daha iyidir.
"Uzun" kilitler yerine atomik işlemleri ve Lua'yı tercih edin.
15) Anti-desenler
Büyük kabarcıkların/görüntülerin depolanması - RAM ve ağların aşırı yüklenmesi.
Finansal değişmezler (bilanço) sadece Redis'te.
'ANAHTARLAR've' dünyayı taramak 'prod içinde.
TTL/jitter yok - son kullanma tarihinde dogpile.
Kritik kuyruklarda 'allkeys-' politikası - basınçlarda veri kaybı.
Kuyrukları, önbelleği ve oturumları kotalar ve öncelikler olmadan tek bir örnekte karıştırma.
Küme'deki farklı yuvaların tuşları üzerinde çalışan Lua komut dosyaları.
16) Uygulama kontrol listesi
1. Rolleri tanımlayın: önbellek/oturumlar, kuyruklar/akışlar, sayaçlar/sınırlar - örneklere/kümelere gönderin.
2. Görev için maxmemory-policy seçin; Sınır koymak ve tahliyeleri izlemek.
3. Anahtar adlandırma, devre sürümleri, TTL matrisi + jitter; Üst anahtarlar için tek uçuş.
4. Kuyruklar için - Akışlar (gruplar, retrays, DLQ), ertelenmiş için - ZSet + transferi.
5. HA: replication + Sentinel veya Redis Cluster; Müşteri yük devrini kontrol et.
6. Kalıcılık: Senaryo altında RDB/AOF; Düzenli yedeklemeler ve kurtarma testi.
7. Güvenlik: ACL, TLS, özel ağlar, tehlikeli komutların yasaklanması.
8. Gözlemlenebilirlik: gecikme, ops/sn, bellek, tahliyeler, çoğaltma gecikmesi, akış PEL.
9. FinOps: bellek profilleri, büyük tuşlar, sıkıştırma, LFU; Büyük lekeler için redis kaçının.
10. Model dokümantasyonu (oran limiti, idempotency, leadboards) ve yük testleri.
Sonuç
Redis, hızın'çok işlevli bir İsviçre bıçağı'dır: önbellek, kuyruklar, sayaçlar, afişler, coğrafi ve olasılıksal yapılar. Gücü, veri yapılarının doğru seçimi, TTL/engellilik disiplini, işlemlerin atomikliği ve iyi düşünülmüş HA/kalıcılık ve gözlemlenebilirlikte yatmaktadır. Kritik değişmezleri (para, muhasebe) "gerçeğin kaynağına" bırakırken milisaniyelerin ve yüksek RPS'nin önemli olduğu Redis'i kullanın - bu şekilde platform hem hızlı hem de güvenilir kalacaktır.