Logo GH

Texnologiya və infrastruktur → Redis: in-memory-solutions

Redis: in-memory-solutions

1) Redis uyğun harada

Redis - zəngin məlumat strukturları ilə yüksək sürətli in-memory anahtar dəyəri saxlama. Tipik ssenarilər:
  • Cache (read-through/aside, TTL, SWR) və sessiyalar.
  • Sayğaclar və kvotalar: rate limiting, antifrod, kampaniya limitləri.
  • Lider bordları/reytinqləri (ZSet), «top-N» tövsiyələri.
  • Hadisə növbələri/şinləri (Streams/PubSub), outbox/inbox, retray.
  • İdempotentlik (TTL ilə açarlar), de-dup webhook.
  • Geo (ən yaxın nöqtələrin axtarışı), Bitmap (bayraqlar, DAU).
  • Təxəllüslər/tokenlər və qısa ömürlü avtorizasiya caches.
💡 Vacibdir: pul balansları və kritik invariantlar üçün Redis yalnız oxu sürətləndirici və ya DBB/ledger-də «həqiqət mənbəyi» olan jurnal/cache kimi istifadə olunur.

2) Data strukturları və nə zaman tətbiq

String: dəyərlər/sayğaclar ('INCRBY'), idempotent açarları.
Hash: profil/konfiqurasiya aqreqatları, «yüngül» obyektlərin saxlanması.
List: sadə növbələr (lakin replay/offset-semantika olmadan).
Set: unikal elementlər, deduplikasiya.
ZSet: sürət sıralaması (liderbordlar, TTL təqvimi - «gecikmiş» hadisələr).
Stream: İstehlak qrupları ilə sabit növbələr, 'XREADGROUP '/replay - vebhuk, CDC, retray üçün.
Geo: 'GEOADD/GEORADIUS' - ən yaxın nöqtə/merchant.
Bitmap/Bitfield: Bayraqlar seriyası (günlük loginlər, DAU/WAU).
HyperLogLog: təxmini unikal (UU) yaddaş ucuz.
Bloom/Cuckoo (modullar): sürətli varlıq yoxlamaları, mənbəyə «MISS» azaldır.

Modullar:
  • RedisJSON (JSON sənədləri), RediSearch (indeksasiya/axtarış), RedisBloom (ehtimal strukturları), TimeSeries (metrik/aqreqasiya).

3) Açarlar, TTL və yaddaş siyasəti

Neyminq və seqmentasiya:

tenant:{t}:domain:{d}:{entity}:{id}:v{schema}    region={R}    currency={C}    lang={L}

Version ('vN'), yalnız əhəmiyyətli ölçmələri daxil edin (region/valyuta/dil/tenant).
per-tenant açar sahələrini təcrid edin.

TTL və «təravət»:
  • TTL matrisini (san/dəq/saat) istifadə edin, stampede qarşısını almaq üçün jitter (± 10-20%) əlavə edin.
  • Qaynar açarlar üçün - refresh-ahead və single-flight (bir lider yeniləyir).
Yerdəyişmə siyasəti (maxmemory-policy):
  • 'allkeys-lru/lfu' - TTL asılılığı olmayan ümumi cache.
  • 'volatile-lru/lfu' - yalnız TTL açarları.
  • 'noeviction' - həddindən artıq (kritik növbələr/sayğaclar üçün daha təhlükəsizdir).
  • Ssenari üçün seçin və həmişə izləyin 'evicted _ keys'.

4) Əməliyyatlar, paylaynlar və skriptlər

Payplays: RTT-ni azaltın, 10-100 komandanı qruplaşdırın.
Əməliyyatlar (MULTI/EXEC): oxunuşları təcrid etmir, lakin paketi atom şəklində yerinə yetirir.
Optimistic locking: 'WATCH key' → yoxlama → 'MULTI/EXEC'.
Lua skriptləri: server tərəfində atom məntiqi (rate limit, locks, composite-əməliyyatlar).

💡 Tək qovşaqlı Redis Lua skriptləri üçün yaxşıdır; Cluster-də - bütün açarların bir hash yuvasına düşdüyünə əmin olun (hash tag '{...}').

5) Növbələr və şinlər: List vs Stream

List + 'BRPOP' - sadə, lakin heç bir consumer groups, offset/replay, zəif düşmə müqaviməti.
Stream: 'HADD → XREADGROUP → XACK', retry-deadletter (N dəqiqədə keçilməz), açar partizanı. PSP/KYC vebhukları, gecikmiş ödənişlər/bildirişlər üçün tövsiyə olunur.

Prioritet növbələr: prioritetlər üzrə bir neçə axın, istehlakçılar ilk növbədə yüksəkdən «sorurlar».
Gecikmiş tapşırıqlar: ZSet harada score = timestamp; periodik 'ZRANGEBYSCORE' ≤ now → Stream transfer.

6) Yüksək mövcudluq və miqyas

Replikasiya: master → replica (read-scale).
Sentinel: avtomatik failover master 'a, aşkarlama, müştəri URI.
Redis Cluster: 16384 slot, üfüqi scale-out. Bir neçə strukturdan istifadə edən açarları '{order: 123}' hash etiketlərinə bükün.

Nümunələr:
  • Keş/seanslar üçün - klaster/replikalar, 'client-side hashing' SDK tərəfindən dəstəklənir.
  • Növbələr/axınlar üçün - xaç-slot əməliyyatlarını minimuma endirin; domen açarları ilə partiyalaşdırın.

7) Persistentlik: RDB, AOF və backup

RDB (şəkillər): daha sürətli, daha qənaətli; son saniyə/dəqiqə itkisi riski.
AOF (jurnal): daha az itki; 'everysec/always' rejimləri. AOF sıxılması və periodik yenidən qablaşdırma.
Hibrid: RDB + AOF → sürətli bərpa + orta itki.
Backup: obyektin anbarına snapshotlar və AOF nüsxələri; bərpa mütəmadi yoxlayın.

Kritik növbələr/idempotentlik üçün AOF 'everysec' + replikasiyasını seçin.

8) Təhlükəsizlik və uyğunluq

AUTH/ACL: rolları per-app, «təhlükəli» komandaların qadağan ('FLUSHALL', 'KEYS').
TLS müştəri-server və qovşaqlararası linklərdə; sabit egress-IP.
Şəbəkə seqmentasiyası: xüsusi alt şəbəkələr, SG/NACL; Yalnız lazımi xidmətlərdən/neyspaceslərdən çıxış.
Sirləri qeyd etməyin; Redis-də PAN/PII - yalnız tokenlər/törəmələr.
Açar əmrləri: 'KEYS' -dən çəkinin - 'SCAN' istifadə edin.

9) Müşahidə və SLO

Açar metriklər:
  • Latency (P95/P99), `instantaneous_ops_per_sec`, `connected_clients`.
  • Hit ratio, evicted_keys, expired_keys.
  • Memory: used, fragmentation ratio, RSS, allocator stats.
  • Replication lag, AOF/RDB tezlik və ölçüləri, fork time.
  • Streams: PEL (pending entries list), delivery latency, retry count.
SLO nümunələri:
  • Redis P99 əməliyyatları ≤ 5-10 ms.
  • Evictions ≤ 1 %/saat (Cash Space).
  • Stream delivery P99 ≤ 500 мс, retry rate < 2%.

10) FinOps və resursların planlaşdırılması

Yaddaş bahadır: $/GB-ay RAM ölçün vs origin/DB üçün qənaət sorğular.

💡 1-2 KB sıxılma qiymətlərini daxil edin (CPU-ya baxın).

LFU daha az həcmdə ən yaxşı hit verə bilər.
Şəkillər/böyük bloblar üçün - Redis deyil: CDN + obyekt saxlama istifadə edin.

11) iGaming/Fintech üçün nümunələr

11. 1 Rate limiting (sürüşmə pəncərəsi, Lua)

Fikir: «INCRBY» pəncərə açarında + TTL; Lua atom limiti yoxlayır və artırır.

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 Sorğuların idempotentliyi

Açar 'idemp: {request _ id}' ilə TTL 24h, qiymət - nəticə/status. Əməliyyat etməzdən əvvəl - varlığını yoxlayın.

11. 3 Liderbordlar

`ZINCRBY leaderboard:game:{g} score user:{u}` → `ZREVRANGE... WITHSCORES`.
Bölgə/tenant üzrə Top N üçün - ayrı-ayrı ZSet və ya prefikslər.

11. 4 PSP vebhuk növbəsi

'HADD psp: webhooks...' → istehlakçı qrupları 'XGROUP CREATE psp: webhooks g1 $'.
PEL-scan vasitəsilə «asılı» mesajların retraisi ('XPENDING' → 'XCLAIM').

11. 5 Gecikmiş ödənişlər

ZSet 'payout: due' (score = epoch) → worker vaxtaşırı hazır elementləri Stream 'payout: exec' -ə köçürür.

11. 6 Antifrod sayğacları

'PFADD' (unikal) + 'INCR' (intensivlik) + geo/ASN etiketləri; əl yoxlama üçün tetikleyicilər.

12) Yaddaş və performans ilə iş

Müştəri qoşulma hovuzları; RTT (keep-alive) azaldın.
Bir paket komandaya paylayın.
Böyük keys ('MEMORY USAGE', 'SCAN') - obyektləri parçalamaq daha yaxşıdır.
Az sahəli Hash bir çox fərdi açarlardan daha qənaətlidir.
Profit testlərlə təsdiqlənərsə io-threads (read-heavy) daxil edin.
Prod tez-tez 'FLUSHDB/ALL' çəkinin; təhlükəsiz silmək üçün prefikslər və 'UNLINK' vasitəsilə idarə edin.

13) Multi-tenant və izolyasiya

Ayrı-ayrı klasterlər/instants və ya logical DB per-tenant (yük kiçik olduqda).
Açar/yaddaş kvotaları, ayrı ACL.
namespace açarları və metrik prefikslər.

14) Locking və uyğunluq

SET key val NX PX = ttl - sadə mutex.
Redlock: diqqətlə istifadə edin; paylanmış kritik əməliyyatlar üçün «həqiqət mənbəyinə» (BD/ledger) və idempotent əməliyyatlarına güvənmək daha yaxşıdır.
«Uzun» bloklar əvəzinə atom əməliyyatları və Lua üstünlük.

15) Anti-nümunələr

Böyük blobların/şəkillərin saxlanması - RAM və şəbəkələrin həddindən artıq yüklənməsi.
Maliyyə invariantları (balans) yalnız Redis.
'KEYS' və «dünyanı tarama» prodda.
TTL/Jitter olmaması - sona çatdıqda dogpile.
Kritik növbələrdə 'allkeys-' siyasəti → təzyiq zamanı məlumat itkisi.
Kvota və prioritetlər olmadan bir instansiyada növbələrin, keşlərin və sessiyaların qarışdırılması.
Cluster-də müxtəlif slotların açarları ilə işləyən Lua skriptləri.

16) Giriş çek siyahısı

1. Rolları müəyyənləşdirin: keşlər/sessiyalar, növbələr/axınlar, sayğaclar/limitlər - instansiyalar/klasterlər üzrə paylayın.
2. Tapşırıq üçün maxmemory-policy seçin; Limitləri təyin edin və evictions monitorinqi.
3. Neyminq açarları, sxemlərin versiyaları, TTL matrisi + jitter; üst açarları üçün tək uçuş.
4. Növbələr üçün - Streams (qruplar, retralar, DLQ), təxirə salınanlar üçün - ZSet + transfer.
5. HA: + Sentinel və ya Redis Cluster replikasiyası; müştərinin failover yoxlayın.
6. Persistentlik: RDB/AOF ssenari altında; müntəzəm backup və bərpa testi.
7. Təhlükəsizlik: ACL, TLS, xüsusi şəbəkələr, təhlükəli komandaların qadağan edilməsi.
8. Müşahidə müddəti: latency, ops/sec, memory, evictions, replication lag, stream PEL.
9. FinOps: yaddaş profilləri, böyük açarlar, sıxılma, LFU; böyük blobs üçün Redis çəkinin.
10. Nümunələrin sənədləşdirilməsi (rate-limit, idempotentlik, liderbordlar) və yükləmə testləri.

Yekun

Redis «çoxfunksiyalı İsveçrə bıçağı» sürətidir: cache, növbələr, sayğaclar, liderbordlar, geo və ehtimal strukturları. Onun gücü məlumat strukturlarının düzgün seçilməsində, TTL/əlillik intizamında, əməliyyatların atomarlığında, həmçinin düşünülmüş NA/persistentlik və müşahidə edilməsində olur. Kritik invariantları (pul, mühasibat uçotu) «həqiqət mənbəyinə» buraxarkən, millisaniyələrin və yüksək RPS-in vacib olduğu yerlərdə Redis istifadə edin - beləliklə platforma həm sürətli, həm də etibarlı olaraq qalacaq.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.