GH GambleHub

Caching Memory: Redis, Memcached

Caching Memory: Redis, Memcached

1) Cache nə vaxt və nə üçün

Məqsədlər: gizliliyi azaltmaq, DB/PSP/xarici API-ləri boşaltmaq və zirvələri yumşaltmaq.
Keş təbəqələri çox vaxt çoxsəviyyəlidir: in-process (L1) → service-level (Redis/Memcached L2) → edge/CDN. Daxili önbellək «isti» oxunuşları sürətləndirir, L2 - xidmətlər üçün ümumi, edge - ictimai məzmun üçün.

2) Redis vs Memcached - qısa

MeyarRedisMemcached
Məlumat növləriSətirlər, heşlər, siyahılar, çoxluqlar, zset, bitmaplar, HyperLogLog, Streams, Bloom/CF (modullar vasitəsilə)Açar-qiymət (sətirlər)
PersistentlikAOF/RDB, no-fsync-loss konfiqurasiya zamanıYox
KlasterRedis Cluster (şardinq, failover )/SentinelYerli failover olmadan müştəri şard
Əməliyyatlar/skriptlərMULTI/EXEC, EVAL (Lua), atom əməliyyatlarıYox
TTL/evictionSiyasətin incə tənzimlənməsiƏsas
Gecikmə/yaddaşBir az daha çox overheadÇox yüngül, proqnozlaşdırıla bilən

Qayda: Mürəkkəb data strukturları, persistentlik, pub/sub/streams/skriptlərə ehtiyacınız varsa - Redis edin. Dayanıqlılıq olmadan super sadə, sürətli, ucuz KV cash layer varsa - Memcached.

3) Caching şablonları

3. 1 Cache-aside (lazy)

App cache oxumaq → səhv → DB oxumaq → TTL ilə cache qoyur.

Sadə TTL nəzarəti, cache-dən müstəqillik. − Səhvlər zamanı «fırtına» mümkündür.

3. 2 Read-through

Müştəri/proxy özü səhv olduqda origin-dən çəkir və cache-yə qoyur.

Mərkəzləşdirilmiş məntiq. − Daha mürəkkəb infrastruktur.

3. 3 Write-through / Write-behind

Write-through: əvvəl cache, sonra DB qeyd.
Write-behind: növbəyə yazmaq, DB-də asenxron flaş (gözəlləşdikdə potensial itki - bir jurnal lazımdır).

3. 4 Two-tier (L1+L2)

L1 (in-process) qısa TTL və yumşaq TTL ilə, L2 (Redis/Memcached) - «cache həqiqəti». pub/sub vasitəsilə əlillik.

4) TTL, fırtına və sabitlik

TTL: Məlumat dəyişmə tezliyinə yaxın verin. Qaynar açarlar üçün TTL (jitter) randomizasiyasından istifadə edin: 'ttl = base ± rand (0.. base0. 1) '- sinxron axınları aradan qaldırır.

Dogpile (thundering herd): səhvləri qoruyun:
  • Singleflight: yalnız bir proses yenidən qurulur (Lua nümunəsinə baxın).
  • Soft-TTL + background refresh: 'soft _ ttl' sonra köhnəlmiş (stale) verin və fon yeniləyin.
  • Semaphore/lock: `SET key:lock value NX PX=2000`.
  • Near-stale: API cavabları üçün 'stale-while-revalidate' (bax bölmə 8).

5) Açarlar, Neyspaces, Serializasiya

5. 1 Açarların adlandırılması

Şablon: '{domain}: {entity}: {id}: {field}'

Nümunələr:
  • `user:profile:42` `catalog:product:1001:v2` `psp:rates:2025-11-03`

Sxemin versiyasını əlavə edin (': v2') - bu kütləvi əlilliyi asanlaşdırır.

5. 2 «Məkan versiyası» vasitəsilə Neyspace

Açarı saxlayın 'ns: catalog = 17'. Real açarları: 'catalog: 17: product: 1001'. Qlobal əlillik kataloqu üçün sadəcə 'ns: catalog' əlavə edin.

5. 3 Serializasiya/sıxılma

JSON - rahat, lakin ağır. MessagePack/CBOR istifadə edin.
Böyük payload (> 1-2 KB) üçün sıxma (LZ4/ZSTD) daxil edin. Redis - müştərinin tərəfində.

6) Qaynar açarlar və çardaq

Hot-keys: hit/miss/byte ilə top-N-ni izləyin. Həddindən artıq isti açarlar üçün:
  • Replicated read pattern: bir neçə shard açarına 'hot: k: 1.. N' qiymətini təkrarlayın, oxuyarkən təsadüfi seçin.
  • Local L1: əlillik abunəsi ilə prosesi yaddaşda saxlayın.
Şardlaşdırma:
  • Redis Cluster - native (16384 hash-slot).
  • Memcached - müştəri konsistent hash.
  • Hash-tag Redis '{...}' açar yuvasını qeyd edir: 'user: {42}: profile' və 'user: {42}: limits' eyni kürəkdə olacaq.

7) Yerdəyişmə siyasəti və ölçüləri

Redis `maxmemory-policy`: `allkeys-lru`, `volatile-lru`, `allkeys-lfu`, `noeviction` и т. д. Cache üçün adətən 'allkeys-lru '/' allkeys-lfu'.
Memcached — LRU на item-slab.
Açar ölçüsü və value: max item size (Memcached default 1 MB, sazlama slab).
Yaddaş həddini aşmaq proqnozlaşdırıla bilər: aktiv yolda 'noeviction' deyil.

Redis (fraqment):

maxmemory 32gb maxmemory-policy allkeys-lfu hz 50 tcp-keepalive 60

8) Fırtına mühafizə nümunələri - kod

8. 1 Redis Lua singleflight (psevdo)

lua
-- KEYS[1] = data_key, KEYS[2] = lock_key
-- ARGV[1] = now_ms, ARGV[2] = soft_ttl_ms, ARGV[3] = hard_ttl_ms, ARGV[4] = lock_ttl_ms local payload = redis. call("GET", KEYS[1])
if payload then local meta = redis. call("HGETALL", KEYS[1].. ":meta")
local last = tonumber(meta[2] or "0")
if tonumber(ARGV[1]) - last < tonumber(ARGV[2]) then return { "HIT", payload }
end if redis. call ("SET," KEYS [2], "1," "NX," "PX," ARGV [4]) then return {"REFRESH," payload} - one worker updates, the rest give stale end return {"STALE," payload}
end if redis. call("SET", KEYS[2], "1", "NX", "PX", ARGV[4]) then return { "MISS", nil }
end return { "BUSY", nil }

8. 2 Node. js cache-aside (sadələşdirilmiş)

js const v = await redis. get(key);
if (v) return decode(v);
const lock = await redis. setNX(key+":lock", "1", { PX: 1500 });
if (lock) {
const fresh = await loadFromDB(id);
await redis. set(key, encode(fresh), { EX: ttl, NX: false });
await redis. del(key+":lock");
return fresh;
} else {
await sleep(60);           // short backoff const retry = await redis. get (key) ;//give someone's already filled return decode (retry);
}

9) Əlillik və uyğunluq

Hadisə ilə əlaqədar: DB-də dəyişiklik edildikdə 'invalidate' hadisəsini dərc edin: {ns}: {id} '→ abunəçilər açarları silirlər.
Zamanlayıcı: tez-tez dəyişən məlumatlar üçün qısa TTL.
Version: bax 'ns:' açarları.
Outbox: əlilliyin çatdırılması zəmanəti (log/topik, retraia hadisəsi).
Cache əməliyyatlarının idempotentliyi: 'SETXX/SETNX', versiyaları ('etag') və inkrement üçün hash sahələrini istifadə edin.

10) Replikasiya, klaster, failover

10. 1 Redis

Sentinel: avtomatik failover master-replica (stateFUL IP/adı).
Cluster: charding + avtomatik failover; müştərilər 'MOVED/ASK' redaktorlarını dəstəkləməlidirlər.
AOF/RDB: cache üçün adətən 'appendfsync everysec', persistentlik olmadan (təmiz cache kimi) mümkündür.

10. 2 Memcached

Qutudan replikasiya yoxdur. Etibarlılıq - çox qapılı şard + n '(client-side) təkrar vasitəsilə.
Nod düşdükdə - səhvlərin artması və keşin «yenidən öyrədilməsi».

10. 3 K8s və şəbəkə aspektləri

Redis/Memcached pod 'ların tez-tez təkrar satışını sevmir; StatefulSet + AZ antipodları, sabit PVC/POD IP istifadə edin.
PodDisruptionBudget və TopologySpreadConstraints qoyun.

11) Əməliyyatlar, skriptlər və atom (Redis)

INCR/DECR, HINCRBY - sayğaclar, kvotalar, rate-limits (yalnız persist nəzərə alın).
MULTI/EXEC - atom komandaları paketi.
Lua (EVAL) - yarışsız read-modify-write.
Pipeline - RTT-ni azaldır (xüsusilə şəbəkə hopunda).

Nümunə rate-limit (token bucket, sadələşdirilmiş):
lua
-- KEYS[1]=bucket, ARGV[1]=capacity, ARGV[2]=refill_rate_per_sec, ARGV[3]=now_ms
-- Returns 1 if the token is issued, otherwise 0

12) Növbələr, pub/sub və Streams (Redis)

Pub/Sub: əlillik, siqnallar. Saxlama olmadan, yalnız onlayn dinləyicilər.
Streams: təsdiq hadisələri (ACK), istehlakçı qrupu, retralar - write-behind/fan-auts üçün əlverişlidir.
Lists ('BRPOP'): sadə növbələr.
Redis-i backup olmadan «vahid şin» kimi istifadə etməyin - bu Kafka deyil, cache/sürətli şindir.

13) Təhlükəsizlik və giriş

Şəbəkələrin izolyasiyası/VPC, mTLS ingress səviyyəsində, ACL/parollar ('requirepass '/ACL Redis 6 +).
Redis Disable dangerous komandaları ('CONFIG', 'FLUSHALL', 'KEYS') vasitəsilə ACL.
Memcached üçün - ictimai interfeyslərə qulaq asmayın, '-U 0' (UDP olmadan), yalnız xüsusi şəbəkələr.
PII saxlamaq deyil; lazım gələrsə - qısa TTL + proqram səviyyəsində şifrələmə.

14) Müşahidə və xidmət

Açar metriklər:
  • Hit ratio/Miss ratio (namespace/marşrut üzrə).
  • Latency p95/p99 komandaları 'GET/SET/MGET', timeouts.
  • Evictions и OOM errors.
  • Replication lag (Redis), cluster state, migrate/rehash events.
  • Top-N keys trafik/bayt (sampling).
  • Log: Yavaş komandalar ('slowlog'), şəbəkə səhvləri.
  • Dashboard: ümumi (CPU/RAM/connections), komandalar, klaster slots, sentinels, Prometheus ixracatçıları vasitəsilə.

15) Konfiqlər və yerləşdirmə - nümunələr

15. 1 Redis Sentinel (fraqment)


port 6379 protected-mode yes appendonly yes appendfsync everysec maxmemory-policy allkeys-lfu
`sentinel. conf`:

sentinel monitor m1 10. 0. 0. 11 6379 2 sentinel auth-pass m1 sentinel down-after-milliseconds m1 5000 sentinel failover-timeout m1 60000

15. 2 Redis Cluster (helm values, sadələşdirilmiş)

yaml cluster:
enabled: true nodes: 6  # 3 masters + 3 replicas persistence:
size: 100Gi resources:
requests: { cpu: "500m", memory: "2Gi" }

15. 3 Memcached (deployment)

yaml containers:
- image: memcached:1. 6 args: ["-m", "32768", "-I", "2m", "-v", "-t", "8", "-o", "modern"]
ports: [{ containerPort: 11211 }]

15. 4 NGINX kimi read-through proxy (API kontur)

nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api:100m max_size=10g inactive=10m;
map $request_uri $cache_key { default "api:$request_uri"; }
location /api/ {
proxy_cache api;
proxy_cache_valid 200 1m;
proxy_cache_use_stale updating error timeout http_500 http_502 http_503 http_504;
proxy_cache_lock on;      # singleflight на уровне NGINX proxy_cache_key $cache_key;
proxy_pass http://backend;
}

16) Test və geytalar

Yük profilləri «soyuq/isti/isti keşdir».
Qaçırma inyeksiyası (purge kütləvi) - origin «yenidən öyrənməyə» tab gətirməlidir.
Alertlər: kəskin eniş hit-ratio, miss latency artım, evictions uçqun, timeouts artım.

17) Anti-nümunələr

«Həqiqəti» AOF/RDB olmadan və rezervasiya olmadan Redis-də saxlayın.
Dəyişkən məlumatlar üçün TTL = 0 (müddətsiz) → əbədi qeyri-sabitlik.
Kütləvi 'KEYS' prodda.
jitter/soft-TTL → sinxron axını və fırtına yoxdur.
Charding/replika olmadan bütün komandalar üçün bir instant.
Atomiklik/skript tələb edən tapşırıqlar üçün Memcached istifadə edin.

18) Giriş çek siyahısı (0-45 gün)

0-10 gün

Seçin şablon (cache-aside + L1/L2), təsvir açarları, TTL, nişanlar.
jitter/soft-TTL, singleflight daxil edin; əsas alertlər/daşbordlar.
Redis üçün - ACL, protected-mode, slowlog, maxmemory-policy konfiqurasiya.

11-25 gün

Charding keçid (Redis Cluster və ya müştəri hash), replikalar.
pub/sub və ya neyspace versiyası vasitəsilə əlillik; DB outbox.
Cache «yenidən öyrənmə» yük testləri; limiting origin.

26-45 gün

Avtomobil promosyonu/kanarya TTL, buraxılışdan əvvəl qızdırma.
Streams üçün write-behind/fon atışları.
Hit-ratio, top-keys, yaddaş dəyəri ilə bağlı həftəlik hesabatlar.

19) Yetkinlik metrikası

Hit-ratio L2 ≥ 80% (marşrut/neyspeys statistikası).
P95 GET <2-3 ms (in-DC), səhvlər <SLO origin.
Kütləvi əlillik zamanı 0 fırtına (testlərlə sübut edilmişdir).
Avtomatik əlillik və neyspaces versiyası.
Charding/replikasiya nəzərə çarpan deqradasiya olmadan 1 düyün nasazlığını əhatə edir.

20) Nəticə

Güclü keşin arxitekturası açar nizam-intizamı və TTL, fırtınadan qorunma, düzgün çardaq və proqnozlaşdırıla bilən yerdəyişmədir. Redis zəngin semantika, persistentlik və atom verir; Memcached - maksimum sadəlik və sürət. Müşahidə, hadisələrin əlilliyi, L1 + L2 əlavə edin və cache təsadüfi düşmə və «mistik» uğursuzluqların mənbəyi deyil, platformanın sürətləndiricisi olacaq.

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.