Logo GH

Технология және инфрақұрылым → 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).
  • Бүркеншік атаулар/токендер және қысқа мерзімдік авторизация кэштері.
💡 Маңызды: ақша балансы және критикалық инварианттар үшін Redis тек оқу үдеткіші немесе СУБД/ledger-де «ақиқат көзі» бар журнал/кэш ретінде пайдаланылады.

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 және «жаңалық»:
  • TTL матрицасын (сек/мин/сағ) пайдаланыңыз, stampede болдырмау үшін джиттерді (10-20% ±) қосыңыз.
  • Ыстық кілттер үшін - refresh-ahead және single-flight (бір көшбасшы жаңартады).
Ығыстыру саясаты (maxmemory-policy):
  • '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-операциялар).

💡 Бір торапты Redis Lua скрипттері үшін жақсы; Cluster - барлық кілттердің бір хэш-слотқа (хэш-тег '{...}') кіретініне көз жеткізіңіз.

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.
SLO мысалдары:
  • Redis P99 ≤ 5-10 мс.
  • Evictions ≤ 1 %/сағ (кеш кеңістігі).
  • Stream delivery P99 ≤ 500 мс, retry rate < 2%.

10) FinOps және ресурстарды жоспарлау

Жады жол: $/GB-ай RAM өлшеу vs origin/DB сұраныстарды үнемдеу.

💡 1-2 КБ мәндерінің компрессиясын қосыңыз (CPU қараңыз).

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-ті пайдаланыңыз, бұл ретте критикалық инварианттарды (ақша, есеп) «ақиқат көзіне» қалдырыңыз - осылайша платформа жылдам және сенімді болып қалады.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Telegram
@Gamble_GC
Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.