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
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.
- 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.
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).
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.