Технология және инфрақұрылым → Redis: in-memory-шешімдер
Redis: in-memory-шешімдері
1) Redis орынды
Redis - бай деректер құрылымдары бар жоғары жылдамдықты in-memory кілт-мәні. Типтік сценарийлер:- Кеш (read-through/aside, TTL, SWR) және сессиялар.
- Есептеуіштер мен квоталар: rate limiting, антифрод, науқан лимиттері.
- Көшбасшы борттар/рейтингтер (ZSet), «топ-N» ұсынымдары.
- Оқиғалар кезектері/шиналары (Streams/PubSub), outbox/inbox, ретрайлер.
- Вебхуктардың теңсіздігі (TTL кілттері), de-dup.
- Geo (жақын нүктелерді іздеу), Bitmap (жалаушалар, DAU).
- Бүркеншік атаулар/токендер және қысқа мерзімдік авторизация кэштері.
2) Деректер құрылымы және оларды қашан қолдану
String: мәндер/есептегіштер ('INCRBY'), теңсіздік кілттері.
Hash: профиль/пішін агрегаттары, «жеңіл салмақты» нысандарды сақтау.
List: қарапайым кезектер (бірақ replay/offset семантикасы жоқ).
Set: бірегей элементтер, дедупликация.
ZSet: жиек бойынша сұрыптау (лидбордтар, TTL күнтізбесі - «кейінге қалдырылған» оқиғалар).
Stream: тұтыну топтарымен тұрақты кезектер, 'XREADGROUP '/replay - вебхуктер, CDC, ретрайлер үшін.
Geo: 'GEOADD/GEORADIUS' - ең жақын нүктелер/мерчанттар.
Bitmap/Bitfield: жалаулар сериясы (күн бойынша логиндер, DAU/WAU).
HyperLogLog: шамамен бірегей (UU) жады арзан.
Bloom/Cuckoo (модульдер): бар болуын жылдам тексеру, дереккөзге «MISS» азайтады.
- RedisJSON (JSON құжаттары), RediSearch (индекстеу/іздеу), RedisBloom (ықтималдық құрылымдары), TimeSeries (метрика/агрегация).
3) Кілттер, TTL және жад саясаты
Нейминг және сегментация:
tenant:{t}:domain:{d}:{entity}:{id}:v{schema} region={R} currency={C} lang={L}
('vN') нұсқасын жасаңыз, тек маңызды өлшемдерді қосыңыз (өңір/валюта/тіл/тенант).
per-tenant кілттерінің кеңістігін оқшаулаңыз.
- TTL матрицасын (сек/мин/сағ) пайдаланыңыз, stampede болдырмау үшін джиттерді (10-20% ±) қосыңыз.
- Ыстық кілттер үшін - refresh-ahead және single-flight (бір көшбасшы жаңартады).
- 'allkeys-lru/lfu' - TTL тәуелділігі жоқ ортақ кэш.
- 'volatile-lru/lfu' - тек TTL кілті.
- 'noeviction' - толтыру кезінде жазба істен шыққан (шекті кезектер/есептегіштер үшін қауіпсіз).
- Скриптке таңдау және әрқашан 'evicted _ keys' дегенді бақылау.
4) Транзакциялар, пайплайндар және скрипттер
Пайплайндар: RTT төмендетеді, 10-100 команданы топтаңыз.
Транзакциялар (MULTI/EXEC): оқуларды оқшауламайды, бірақ пакетті атомарлық түрде орындайды.
Optimistic locking: 'WATCH key' → тексеру → 'MULTI/EXEC'.
Lua скрипттері: сервер жағындағы атомарлық логика (rate limit, locks, composite-операциялар).
5) Кезектер мен шиналар: List vs Stream
List + 'BRPOP' - қарапайым, бірақ consumer groups, offset/replay жоқ, құлауға әлсіз төзімділік.
Stream: 'HADD → XREADGROUP → XACK', retry-deadletter (N минутта алынбаған), кілт бойынша партиялануы. PSP/KYC вебхуктері, кейінге қалдырылған төлемдер/хабарламалар үшін ұсынылады.
Басым кезектер: басымдықтар бойынша бірнеше ағын, тұтынушылар жоғарыдан бірінші кезекте «сорып» алады.
Кейінге қалдырылған тапсырмалар: ZSet мұнда score = timestamp; кезеңдік 'ZRANGEBYSCORE' ≤ now → Stream.
6) Жоғары қолжетімділік және масштабтау
Репликация: master → replica (read-scale).
Sentinel: автоматты failover master 'a, анықтау, клиенттік URI.
Redis Cluster: 16384 слотқа шардалау, көлденең scale-out. Бірнеше құрылымды пайдаланатын кілттерді '{order: 123}' хэш тегтеріне ораңыз.
- Кэш/сессиялар үшін - кластер/репликалар, 'client-side hashing' SDK қолдайды.
- Кезектер/ағымдар үшін - кросс-слоттық операцияларды барынша азайтыңыз; домен кілттері бойынша партияланыңыз.
7) Персистенттілік: RDB, AOF және бэкаптар
RDB (суреттер): жылдам, үнемді; соңғы секундтарды/минуттарды жоғалту тәуекелі.
AOF (журнал): шығыннан аз; 'everysec/always' режимдері. AOF қысу және мерзімді қайта орау.
Гибрид: RDB + AOF → жылдам қалпына келтіру + орташа шығындар.
Бэкаптар: объектілік қоймаға AOF көшірмелері мен снапшоттары; қалпына келтіруді үнемі тексеріңіз.
Сындарлы кезектер/іспеттілік үшін AOF 'everysec' + репликасын таңдаңыз.
8) Қауіпсіздік және комплаенс
AUTH/ACL: per-қосымша рөлдері, «қауіпті» командаларға тыйым салу ('FLUSHALL', 'KEYS').
Клиент-серверге және торап аралық сілтемелерге TLS; тіркелген egress-IP.
Желіні сегменттеу: жеке кіші желілер, SG/NACL; тек қажетті сервистерден/неймспейстерден ғана қол жеткізу.
Құпияларды түсінбеңіз; PAN/PII Redis - тек токендер/деривативтер.
Кілт пәрмендері: 'KEYS' дегеннен аулақ болыңыз - 'SCAN' дегенді пайдаланыңыз.
9) Бақылау және SLO
Негізгі метриктер:- 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 жиілігі және өлшемдері, fork time.
- Streams: PEL (pending entries list), delivery latency, retry count.
- Redis P99 ≤ 5-10 мс.
- Evictions ≤ 1 %/сағ (кеш кеңістігі).
- Stream delivery P99 ≤ 500 мс, retry rate < 2%.
10) FinOps және ресурстарды жоспарлау
Жады жол: $/GB-ай RAM өлшеу vs origin/DB сұраныстарды үнемдеу.
LFU аз көлемде ең жақсы hit бере алады.
Кескіндер/үлкен блобтар үшін - Redis емес: CDN + нысанды сақтау орнын пайдаланыңыз.
11) iGaming/финтех үшін үлгілер
11. 1 Rate limiting (жылжымалы терезе, Lua)
Идея: 'INCRBY' терезе кілтінде + TTL; Lua атомарлық лимитті тексереді және ұлғайтады.
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 Сұраулардың теңсіздігі
idemp: {request _ id}'s TTL 24h, мән - нәтиже/мәртебе. Операцияны орындау алдында - бар-жоғын тексереміз.
11. 3 Көшбасшы борттары
`ZINCRBY leaderboard:game:{g} score user:{u}` → `ZREVRANGE... WITHSCORES`.
Өңір/тенант бойынша топ-N үшін - жеке ZSet немесе префикстер.
11. 4 PSP вебхук кезегі
'HADD psp: webhooks...' → тұтынушылар тобы 'XGROUP CREATE psp: webhooks g1 $'.
PEL-сканерлеу ('XPENDING' → 'XCLAIM') арқылы «ілініп қалған» хабарламалардың ретраиялары.
11. 5 Кейінге қалдырылған төлемдер
ZSet 'payout: due' (score = epoch) → воркер дайын элементтерді мерзімді түрде Stream 'payout: exec' дегенге көшіріп тұрады.
11. 6 Антифрод-есептегіштер
'PFADD' (бірегей) + 'INCR' (қарқындылығы) + гео/ASN-белгілер комбинациясы; қолмен тексеруге арналған триггерлер.
12) Жадымен және өнімділігімен жұмыс
Клиенттердің қосылу пулдары; RTT (keep-alive) дегенді азайтыңыз.
Командалар бумасына пайплайндарды артық көріңіз.
big keys ('MEMORY USAGE', 'SCAN') - нысандарды бөлшектеген дұрыс.
Аз өрісті Hash көптеген жекелеген кілттерге қарағанда үнемді.
Егер профит тесттермен расталса, io-threads (read-heavy) қосыңыз.
Сынамада FLUSHDB/ALL жиілігінен аулақ болыңыз; қауіпсіз жою үшін префикстер мен 'UNLINK' арқылы басқарыңыз.
13) Мульти-тенант және оқшаулау
Жеке кластерлер/инстанциялар немесе logical DB per-tenant (егер жүктеме аз болса).
Кілттерге/жадыға арналған квоталар, бөлек ACL.
Кілттегі префикстер мен namespace өлшемдері.
14) Locking және келісу
SET key val NX PX = ttl - қарапайым mutex.
Redlock: ұқыпты пайдаланыңыз; бөлінген күрделі транзакциялар үшін «ақиқат көзіне» (ДБ/ledger) және демпотенттік операцияларға сүйенген дұрыс.
«Ұзақ» бұғаттаудың орнына атомарлық операцияларды және Lua-ны таңдаңыз.
15) Қарсы үлгілер
Үлкен блобтарды/бейнелерді сақтау - RAM және желілерді қайта тиеу.
Қаржылық инварианттар (баланс) тек Redis.
«KEYS» және «әлемді сканерлеу».
TTL/jitter - dogpile мерзімі аяқталғанда болмауы.
Шекті кезектегі 'allkeys-' саясаты → қысым кезінде деректерді жоғалту.
Бір инстанциядағы кезектерді, кештерді және сессияларды квотасыз және басымдықсыз араластыру.
Cluster бағдарламасындағы түрлі слоттардың кілттері бойынша жұмыс істейтін Lua скрипттері.
16) Енгізу чек-парағы
1. Рөлдерді анықтаңыз: кеш/сессиялар, кезектер/ағындар, есептегіштер/лимиттер - инстанциялар/кластерлер бойынша таратыңыз.
2. Тапсырма үшін maxmemory-policy таңдаңыз; evictions лимиттері мен мониторингін белгілеңіз.
3. Кілттердің нейминг, схемалардың нұсқалары, TTL-матрица + джиттер; топ-кілттер үшін single-flight.
4. Кезектер үшін - Streams (топтар, ретраилер, DLQ), кейінге қалдырылғандар үшін - ZSet + көшіру.
5. HA: репликалау + Sentinel немесе Redis Cluster; клиенттің файлын тексеріңіз.
6. Персистенттілік: сценарий бойынша RDB/AOF; тұрақты бэкаптар және қалпына келтіру тесті.
7. Қауіпсіздік: ACL, TLS, жеке желілер, қауіпті командаларға тыйым салу.
8. Байқалу: latency, ops/sec, memory, evictions, replication lag, stream PEL.
9. FinOps: жад профильдері, ірі кілттер, компрессия, LFU; үлкен блобтар үшін Redis болдырмаңыз.
10. Паттерндердің құжаттамасы (rate-limit, идемпотенттілік, лидбордтар) және жүктеме тестілері.
Жиынтық
Redis - бұл «көп функциялы швейцариялық пышақ» жылдамдығы: кэш, кезектер, санауыштар, лидбордтар, гео және ықтималдық құрылымдары. Оның күші - деректер құрылымын дұрыс таңдауда, TTL/мүгедектік тәртібінде, операциялардың атомарлық болуында, сондай-ақ НА/персистенттілік пен бақылауда ойластырылған. Миллисекундтар мен жоғары RPS маңызды жерде Redis-ті пайдаланыңыз, бұл ретте критикалық инварианттарды (ақша, есеп) «ақиқат көзіне» қалдырыңыз - осылайша платформа жылдам және сенімді болып қалады.