Kesmek arhitekturasy: Redis, Memcached
Kesmek arhitekturasy: Redis, Memcached
1) Haçan we näme üçin keş
Maksatlar: gizlinligi azaltmak, DB/PSP/daşarky API-leri düşürmek we iň ýokary derejeleri ýumşatmak.
Keshleriň gatlaklary köplenç köp derejeli: in-process (L1) → service-level (Redis/Memcached L2) → edge/CDN. Içerki keş "gyzgyn" okalmagy çaltlaşdyrýar, L2 - hyzmatlar üçin umumy, edge - köpçüligiň mazmuny üçin.
2) Redis vs Memcached - gysgaça
Düzgün: Çylşyrymly maglumat gurluşlary, dowamlylygy, pub/sub/akymlary/skriptleri zerur bolsa - Redis alyň. Durability bolmazdan super-ýönekeý, çalt, arzan KV kesh gatlagy - Memcached.
3) Kesmek şablonlary
3. 1 Cache-aside (lazy)
Programma keshden okaýar → sypdyrma → DB-den okaýar → TTL bilen keshde goýýar.
TTL-e aňsat gözegçilik etmek, keshden garaşsyzlyk. − sypdyrylanda "tupan" bolup biler.
3. 2 Read-through
Müşderiniň/proksiniň özi sypdyrylanda originden çykaryp, kese salýar.
Merkezleşdirilen logika. − Has çylşyrymly infrastruktura.
3. 3 Write-through / Write-behind
Write-through: Ilki kese, soň DB-e ýazyň.
Write-behind: nobata ýazmak, DB-de asinhron fleş (has owadan bolanda potensial ýitgi - magazineurnal gerek).
3. 4 Two-tier (L1+L2)
L1 (in-process) gysga TTL we soft TTL, L2 (Redis/Memcached) - "keshiň hakykaty". pub/sub arkaly maýyplyk.
4) TTL, tupan we yzygiderlilik
TTL: Maglumatlary üýtgetmek ýygylygyna ýakynlaşyň. Gyzgyn açarlar üçin TTL (jitter) randomizasiýasyny ulanyň: 'ttl = base ± rand (0.. base0. 1) '- sinhron akymlary aýyrýar.
Dogpile (thundering herd): ýalňyşlyklary goraň:- Singleflight: diňe bir amal manyny üýtgeder (Lua mysalyna serediň).
- Soft-TTL + background refresh: 'soft _ ttl' -den soň köne (stale) beriň we fon bilen täzeläň.
- Semaphore/lock: `SET key:lock value NX PX=2000`.
- API jogaplary üçin Near-stale: 'stale-while-revalidate' (8-nji bölüme serediň).
5) Açarlar, alamatlar, serializasiýa
5. 1 Açarlary atlandyrmak
Şablon: '{domain}: {entity}: {id}: {field}'
Mysal üçin:- `user:profile:42` `catalog:product:1001:v2` `psp:rates:2025-11-03`
Shemanyň wersiýasyny goşuň (': v2') - bu köpçülikleýin maýyplygy ýeňilleşdirýär.
5. 2 "Giňişlik wersiýasy" arkaly nyşanlar
Açary saklaň 'ns: catalog = 17'. Hakyky açarlar: 'catalog: 17: product: 1001'. Katalogyň global maýyplygy üçin diňe 'ns: catalog' -y ulanyň.
5. 3 Serial/gysyş
JSON - amatly, ýöne agyr. MessagePack/CBOR ulanyň.
Uly LZ4/ZSTD üçin gysyşy açyň (> 1-2 KB). Redisde - müşderiniň tarapynda.
6) Gyzgyn açarlar we şardlamak
Hot-keys: hit/miss/byte boýunça top-N-e gözegçilik ediň. Örän gyzgyn açarlar üçin:- Replicated read pattern: 'hot: k: 1.. N' birnäçe shard açarlaryna goşuň, okanyňyzda tötänleýin saýlaň.
- Local L1: maýyplyga ýazylmak bilen prosesi ýatda saklaň.
- Redis Cluster - native (16384 hash-slot).
- Memcached - müşderi konsistent heşi.
- Redisdäki hash-tag '{...}' açar slaýdyny düzedýär: 'user: {42}: profile' и 'user: {42}: limits' bir çarçuwada düşer.
7) Çalyşmak syýasaty we ölçegleri
Redis `maxmemory-policy`: `allkeys-lru`, `volatile-lru`, `allkeys-lfu`, `noeviction` и т. д. Kesh üçin 'allkeys-lru '/' allkeys-lfu'.
Memcached — LRU на item-slab.
Açaryň ululygy we bahasy: max item size gözegçilik ediň (1 MB standart Memcached, slab sazlamasy).
Ýadyň artykmaçlygy öňünden çaklanyp bilinmez: 'noeviction' işjeň ýolda.
maxmemory 32gb maxmemory-policy allkeys-lfu hz 50 tcp-keepalive 60
8) Tupandan goramak patternleri - 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
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) Maýyplyk we ylalaşyklylyk
Waka boýunça: DB üýtgedeniňizde 'pub/sub' wakasyny 'invalidate: {ns}: {id}' → abonentler açarlary pozýarlar.
Taýmer boýunça: ýygy-ýygydan üýtgeýän maglumatlar üçin gysga TTL.
Wersiýa: 'ns:' açarlaryna serediň.
Outbox: maýyplygy eltmegiň kepilligi (log/topik, retraide waka).
Kesh bilen amallaryň gidempotentligi: 'SETXX/SETNX', wersiýalary ('etag') we inkrement üçin kesh meýdançalaryny ulanyň.
10) Replikasiýa, klaster, jenaýatçy
10. 1 Redis
Sentinel: awtomatiki failover master-replica (stateFUL IP/ady).
Kluster: şardlamak + awtomatiki faýlower; müşderiler 'MOVED/ASK' redaksiýalaryny goldamaly.
AOF/RDB: kesh üçin, adatça 'appendfsync everysec', persistentlik bolmazdan (arassa kesh hökmünde) mümkindir.
10. 2 Memcached
Gutudan göçürme ýok. Ygtybarlylyk - köp gapyly şard + n '(client-side) gaýtalamak arkaly.
Nod ýykylanda - sypdyrmalaryň köpelmegi we keshiň "gaýtadan öwrenilmegi".
10. 3 K8s we tor taraplary
Redis/Memcached pod 'laryň ýygy-ýygydan gaýtadan iberilmegini halamaýar; StatefulSet + AZ antipodlary, kesgitlenen PVC/POD IP ulanyň.
PodDisruptionBudget we TopologySpreadConstraints goýuň.
11) Amallar, skriptlar we atomarlyk (Redis)
INCR/DECR, HINCRBY - hasaplaýjylar, kwotalar, rate-limits (diňe persisti göz öňünde tutuň).
MULTI/EXEC - atom buýruklarynyň bukjasy.
Lua (EVAL) - ýaryşsyz read-modify-write.
Pipeline - RTT-ni azaldar (esasanam tor 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) Nobatlar, pub/sub we akymlar (Redis)
Pub/Sub: maýyplyk, signallar. Saklamak ýok, diňe onlaýn diňleýjiler.
Akymlar: tassyklanan wakalaryň nobatlary (ACK), sarp edijiler topary, retralar - write-behind/fan-autlar üçin amatly.
Lists ('BRPOP'): ýönekeý nobatlar.
Redis-i "hemme zadyň bir tekeri" hökmünde arka tarapsyz ulanmaň - bu Kafka däl, kesh/çalt teker.
13) Howpsuzlyk we elýeterlilik
Tor izolýasiýasy/VPC, mTLS ingress derejesinde, ACL/parollar ('requirepass '/ACL Redis 6 +).
Disable dangerous komandalar Redis ('CONFIG', 'FLUSHALL', 'KEYS') ACL arkaly.
Memcached üçin - köpçülige açyk interfeýsleri diňlemäň, '-U 0' (UDP bolmasa), diňe hususy torlar.
PII saklanylmaýar; zerur bolsa - programma derejesinde gysga TTL + şifrlemek.
14) Gözegçilik we hyzmat etmek
Esasy metrikler:- Hit ratio/Miss ratio (namespace/marşrut boýunça).
- Latency p95/p99 'GET/SET/MGET', timeouts.
- Evictions и OOM errors.
- Replication lag (Redis), cluster state, migrate/rehash events.
- Trafik/baýt boýunça Top-N keys (sampling).
- Bloglar: haýal buýruklar ('slowlog'), ulgam ýalňyşlyklary.
- Daşbordlar: umumy (CPU/RAM/connections), toplynyň toparlary, slotlary, sentinels, Prometheus-eksportçylardan geçip.
15) Konfigi we ýerleşdirmek - mysallar
15. 1 Redis Sentinel (bölek)
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, ýönekeý)
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 read-through proxy (API kontury)
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) Synag we geýtlar
Ýük profilleri "sowuk/ýyly/gyzgyn kesh".
Sypdyrma sanjymy (purge köpçülikleýin) - origin "gaýtadan öwrenişe" çydamaly.
Alertler: hit-ratio-nyň ýiti pese gaçmagy, miss latency-iň ösmegi, evictions-yň göçmegi, timeouts-yň ösüşi.
17) Anti-patternler
"Hakykaty" AOF/RDB-siz we ätiýaçlyk bolmazdan Redis-de saklaň.
Üýtgeýän maglumatlar üçin TTL = 0 (hemişelik) → baky yzygiderlilik.
Köpçülikleýin 'KEYS' -de.
Jitter/soft-TTL → sinhron akymlary we tupan ýok.
Şardlamasyz/replikasyz ähli toparlar üçin bir ýagdaý.
Ýadro/skript talap edýän meseleler üçin Memcached programmasyny ulanyň.
18) Giriş çek-sanawy (0-45 gün)
0-10 gün
Şablony saýla (cache-aside + L1/L2), açarlary, TTL, neýspesleri beýan et.
Jitter/soft-TTL, singleflight; esasy alertler/daşbordlar.
Redis üçin - ACL, protected-mode, slowlog, maxmemory-policy sazlamak.
11-25 gün
Şardirlemäge (Redis Cluster ýa-da müşderi heşi), replikalara geçiň.
pub/sub ýa-da neýspeýsiň wersiýasy arkaly maýyplyk; DB-da outbox.
Keshiň "gaýtadan öwrenilmeginiň" ýükleýji synaglary; limiting origin.
26-45 gün
Awtoulag mahabaty/kanareýa TTL, çykmazdan ozal gyzdyrmak.
Write-behind/fon jübütleri üçin akymlar.
Hit-ratio, top-açarlar, ýat bahasy boýunça hepdelik hasabatlar.
19) Kämillik ölçegleri
Hit-ratio L2 ≥ 80% (marşrutlar/alamatlar boýunça statistika).
P95 GET <2-3 ms (in-DC), ýalňyşlyklar <SLO origin.
Köpçülikleýin maýyplyk wagtynda tupan 0 (synaglar bilen subut edildi).
Neýspeýsleri awtomatiki maýyplaşdyrmak we wersiýalaşdyrmak.
Şardlamak/replikasiýa 1 düwüniň göze görnüp duran pese gaçmazdan şowsuzlygyny ýapýar.
20) Netijenama
Güýçli keşiň arhitekturasy açarlaryň we TTL-iň düzgüni, tupandan goramak, dogry şardlamak we öňünden aýdyp boljak göçürmek. Redis baý semantika, dowamlylyk we atomarlyk berýär; Memcached - iň ýönekeýligi we tizligi. Wakalara syn etmek, maýyplyk, L1 + L2 goşuň we keş tötänleýin ýykylmagyň we "mistiki" bökdençlikleriň çeşmesi däl-de, platformanyň tizlendirijisi bolar.