Logo GH

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.

Modüller:
  • 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.

TTL ve "tazelik":
  • 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).
Ön alma politikaları (maxmemory-policy):
  • '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).

💡 Lua komut dosyaları tek düğümlü Redis için iyidir; Küme'de - tüm anahtarların bir hash yuvasına (hash etiketi '{...}') girdiğinden emin olun.

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.

Desenler:
  • Ö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ı.
SLO örnekleri:
  • 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.

💡 1-2 KB değer sıkıştırmasını etkinleştirin (CPU'ya bakın).

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.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Telegram
@Gamble_GC
Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.