Տեխնոլոգիաներ և ենթակառուցվածքներ Windows Redis: in-memory լուծումներ
Redis: in-memory լուծումներ
1) Որտե՞ ղ է Redis-ը տեղավորվում
Redis-ը բարձր արագընթաց in-memory պահեստն է, որն ունի տվյալների հարուստ կառուցվածքներ։ Տիպիկ սցենարներ
Քեշ (read-through/aside, TTL, SWR) և նստաշրջաններ։
Հաշվիչներ և քվոտաներ ՝ rate limiting, հակաֆրոդ, քարոզարշավի սահմաններ։
Առաջնորդներ/վարկանիշներ (ZSet), «լավագույն N» առաջարկությունները։
Իրադարձությունների հերթերը/անվադողերը (Streams/PubSub), box/inbox, retray։
Idempotenty (TTL), de-dup webhuks։
Geo (մոտակա կետերի որոնում), Bitmap (դրոշներ, DAU)։
Կեղծանունները/հոսանքները և հեղինակային իրավունքի կարճ քեշները։
2) Տվյալների կառուցվածքները և երբ դրանք կիրառվեն
String: Արժեքներ/հաշվիչներ («INCRBY»), գաղափարական բանալիներ։
Hash: 105/եզրերի ագրեգատները, «թեթև» օբյեկտների պահպանումը։
List: պարզ գծեր (բայց առանց replay/www.set-semantics)։
Տե՛ ս ՝ յուրահատուկ տարրեր, դեդուպլիկացիա։
ZSet: (առաջնորդները, TTL օրացույցը «հետաձգված» իրադարձություններ են)։
Stream: Կայուն գծեր սպառողական խմբերի հետ, «XREADGROUP »/replay - webhuks, CDC, retrav։
Geo: «GEOADD/GEORADIUS» - մոտակա կետերը/մերչանտները։
Bitmap/Bitfield: մի շարք դրոշներ (տրամաբանություններ, DAU/WAU)։
HyperLogLog: մոտավոր յուրահատուկ (UU) հիշողության էժան։
Bloom/Cuckoo (մոդուլներ) 'արագ առկայության ստուգումներ, նվազեցնում են MISS-ը աղբյուրին։
Մոդուլները
RedisJSON (JSON փաստաթղթեր), RediSearch (ինդեքսավորում/որոնում), RedisBloom (հավանական կառուցվածքներ), Direct Series (չափումներ/միավորումներ)։
3) Բանալիներ, TTL և հիշողության քաղաքականություն
Նեյմինգը և սեգմենացիան
tenant:{t}:domain:{d}:{entity}:{id}:v{schema} region={R} currency={C} lang={L}
Տարբերեք («vN»), միացրեք միայն նշանակալի չափումները (տարածաշրջանը/արժույթը/լեզուն/տենանտ)։
Իզոլիրացրեք տարածությունները www.per-ten.ru։
TTL և «թարմ»
Օգտագործեք TTL մատրիցը (վայրկյան/րոպե/ժամ), ավելացրեք ջիտտերը (10-20%) սթամեդից խուսափելու համար։
Տաք կոմպոզիցիաների համար 'refresh-ahead և single-flight (մեկ առաջնորդը նորարարում է)։
Հեռացման քաղաքականությունը (maxmemory-policy)
«alkeys-lru/lfu» - ընդհանուր կեշ առանց TTL կախվածության։
«volatile-lru/lfu» - միայն TTL-ի բանալիները։
«wwww.eviction» - հալման ժամանակ ձայնագրման մերժումը (ավելի անվտանգ է կրիտիկական հերթերի/հաշվիչների համար)։
Ընտրել սցենարի տակ և միշտ վերահսկել «evicted _ keys»։
4) Գործարքներ, փամփուշտներ և ջութակներ
Դելպլինները 'նվազեցնում են RTT, խմբավորում 10-100 թիմեր։
Գործարքները (MMS I/EXEC) չեն մաքրում ընթերցումները, բայց ատոմային կերպով կատարում են փաթեթը։
Optimistic systeking: «WATCH key» -ը մեջբերում է «MMS I/EXEC» -ի ստուգումը։
Lua-ջութակները 'ատոմային տրամաբանությունը սերվերի կողմում (rate limit, winks, composite վիրահատություններ)։
5) Գծեր և անվադողեր ՝ List vs Stream
List + «BRPOP» -ը պարզ է, բայց չկա consumer consumps, www.set/replay, անկման թույլ դիմադրություն։
STREAM: «XADD no XREADGROUP no XACK», retry-deadletter (չհամաձայնեցված N րոպեների ընթացքում), բանալին։ Առաջարկվում է PFC/KYC-ի webhuks-ի համար, որոնք հետաձգվել են/ծանուցում։
Առաջնահերթությունները 'մի քանի սթրիմներ գերակայություններում, սպառողները առաջին հերթին «դուրս են հանում»։
Հետաձգված առաջադրանքները 'ZSet որտեղ score = timestamp; պարբերական 'ZRANGEBYSCORE' now-ը հաստատեց Stream տեղափոխումը։
6) Բարձր հասանելիություն և մեծացում
Կրկնօրինակումը 'wwww.replica (read-scale)։
Sentinel: ավտոմատ failover proter 'a, հայտնաբերումը, հաճախորդների URI-ը։
Redis Cluster: Harding 16384, հորիզոնական scale-out։ Մի քանի կառուցվածքներ օգտագործող բանալիները հավաստիացրեք ծանր թեգերի մեջ '+ order: 123 +։
Patterns
Քեշի/նստաշրջանի համար 'կլաստեր/կրկնօրինակներ, «client-side hashing» -ը աջակցվում է SDK-ի կողմից։
Հերթերի/սթրիմների համար 'նվազագույնի հասցրեք քրոսեքսային վիրահատությունները։ անջատեք տիրույթի մասերը։
7) Անձնավորություն ՝ RDB, AOF և bekapps
RDB (նկարներ) 'ավելի արագ, տնտեսական; վերջին վայրկյանների կորստի ռիսկը/րոպե։
AOF (ամսագիր) 'ավելի քիչ ռուսական; ռեժիմները 'everysec/always'։ Սեղմելով AOF-ը և պարբերական փոխպատվաստումը։
Հիբրիդ ՝ RDB + AOF-ն արագ վերականգնում է + չափավոր կորուստները։
Բեքապներ 'AOF պատճենները օբյեկտի պահեստում։ պարբերաբար ստուգեք վերականգնումը։
Քննադատական հերթերի/գաղափարախոսության համար ընտրեք AOF 'everysec' + կրկնօրինակումը։
8) Անվտանգությունն ու համադրումը
AUTH/ACL 'per-հավելվածի դերերը, «վտանգավոր» թիմերի արգելքը («FLUSHALL», «KEYS»)։
TFC-ը հաճախորդի սերվերի և միջգերատեսչական ոսպնյակների վրա։ ֆիքսված 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.
Replanslag, AOF/RDB հաճախականություններ և չափսեր, fork time։
Streams: PEL (pending entries list), delivery latency, retry count.
SLO օրինակներ
Redis P99 վիրահատությունը 5-10 մզ է։
Evictions 241 %/ժամ (քեշ տարածություն)։
Stream delivery P99 ≤ 500 мс, retry rate < 2%.
10) FinOps-ը և ռեսուրսների պլանավորումը
Հիշողությունը 'չափել դոլար/GB-mes RAM-vs խնայողությունները origin/BD-ի համար։
Միացրեք արժեքները> 1-2 KB (տե՛ ս CPU)։
LFU-ն կարող է տալ լավագույն hit ավելի քիչ ժամանակ։
Պատկերների/մեծ բլոբների համար ոչ թե Redis: օգտագործեք CDN + օբյեկտի պահեստ։
11) iGaming/fintech
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 Դիմումների համահեղինակ
Բանալին 'request _ id _ id' s TTL 49h-ից, արժեքը արդյունք/կարգավիճակ է։ Վիրահատությունից առաջ մենք ստուգում ենք ներկայությունը։
11. 3 Առաջնորդներ
`ZINCRBY leaderboard:game:{g} score user:{u}` → `ZREVRANGE... WITHSCORES`.
Լավագույն N-ի համար տարածաշրջանի/tenantu-ը առանձին ZSet-ն է կամ նախածանցերը։
11. 4 Webhuks PBS
"XADD p.ru: webhooks..." XGROUP CREATE p.ru: webhooks g1 դոլար "։
Retrai «կախված» հաղորդագրությունները PEL սկանավորման միջոցով («XPENDING»)։
11. 5 Հետաձգված վճարումներ
ZSet 'payout: due' (score = epoch) worker պարբերաբար տեղափոխում է պատրաստի տարրեր Stream 'payout: exec' edeplication։
11. 6 Հակաֆրոդ հաշվիչներ
«PFADD» (եզակի) + «INCR» (ինտենսիվություն) + geo/ASN-2019; ձեռքի ստուգման գործիքներ։
12) Հիշողության և արտադրողականության հետ աշխատելը
Ռուսական հաճախորդների պուլերը; նվազեցրեք RTT (keep-alive)։
Նախընտրեք թիմերի փաթեթը։
Հետևեք bull keys («MEMORY USAGE», «SCAN») - ավելի լավ է փորձարկել օբյեկտները։
Hash-ը փոքր թվով դաշտեր է, որոնք ավելի տնտեսական են, քան շատ առանձին տարածքներ։
Միացրեք io-threads (read-heavy), եթե պրոֆիլիտը ապացուցված է թեստերով։
Խուսափեք հաճախակի «FLUSHDB/ALA» վաճառքից։ կառավարեք նախածանցների և «UNLINK» -ի միջոցով անվտանգ ինտեգրման համար։
13) Multi-tenant և մեկուսացում
Առանձին կոմպոզիցիաներ/instans կամ logical DB per-tenae (եթե mala)։
Քվոտաները բանալիների/հիշողության վրա, որոնք առանձնացված են ACL-ով։
Preficts-ում և namespace-ում։
14) Systeking-ը և համաձայնությունը
DISKEY val NX PX = tl - պարզ mutex։
Redlock 'օգտագործեք կոկիկ; բաշխված քննադատական գործարքների համար ավելի լավ է ապավինել «ճշմարտության աղբյուրին» (BD/ledger) և գաղափարական վիրահատություններին։
Նախընտրեք ատոմային վիրահատությունները և Lua-ը «երկար» բլոկի փոխարեն։
15) Anti-patterna
Մեծ բլոբների/պատկերների պահպանումը RAM և ցանցերի գերագնահատումն է։
Ֆինանսական ինվարանտները (հավասարակշռությունը) միայն Redis-ում։
«KEYS» և «աշխարհի սկանավորում» վաճառքում։
TTL/ջիթերի բացակայությունը dogpile-ի վրա է։
«Allkeys-» քաղաքականությունը քննադատական հերթերի վրա բացատրում է տվյալների կորուստը ճնշումների ժամանակ։
Հերթերի, կեշի և նստաշրջանների խառնուրդը մեկ ինստանսի մեջ առանց քվոտաների և գերակայությունների։
Lua-ջութակները, որոնք աշխատում են Cluster-ի տարբեր արցունքների բեկորներով։
16)
1. Հիմնական դերերը ՝ քեշ/նստաշրջան, հերթեր/ստրիմա, հաշվիչներ/լիմիտներ, բաժանեք ինստանսի/կլաստերների։
2. Ընտրեք maxmemory-policy առաջադրանքի համար։ տվեք սահմաններ և evictions։
3. Նեյմինգը բացատրում է, սխեմաների տարբերակները, TTL-մատրիցը + ջիտտերը։ single-flight-ը լավագույն մրցույթի համար։
4. Հաջորդների համար 'Streams (խմբեր, retrai, DLQ), հետաձգվածների համար' ZSet + փոխանցումը։
5. HA 'կրկնօրինակումը + Sentinel կամ Redis Cluster; www.failover հաճախորդը։
6. Անձնավորություն ՝ RDB/AOF սցենարի տակ; bekaps և վերականգնման թեստ։
7. Անվտանգությունը ՝ ACL, TSA, մասնավոր ցանցեր, վտանգավոր թիմերի արգելք։
8. Դիտարկումը 'latency, ops/sec, memory, evictions, replanslag, stream PEL։
9. FinOps: հիշողության պրոֆիլներ, մեծ բանալիներ, ագրեսիա, LFU; խուսափեք Redis-ից մեծ բլոբների համար։
10. Patrium (rate-limit, idempotention, առաջնորդներ) և բեռի թեստեր։
Արդյունքը
Redis-ը արագության «բազմաթիվ ֆունկցիոնալ շվեյցարական դանակ» է 'քեշ, հերթեր, հաշվիչներ, առաջնորդներ, գեո և հավանական կառուցվածքներ։ Նրա ուժը տվյալների կառուցվածքների ճիշտ ընտրության մեջ է, TTL/հաշմանդամության կարգապահությունը, վիրահատությունների ատոմականությունը, ինչպես նաև մտածված NA/անձնազոհության և դիտարկման մեջ։ Օգտագործեք Redis-ը այնտեղ, որտեղ միլիսեքսունդները և բարձր RPS-ները կարևոր են, միևնույն ժամանակ թողնելով քննադատական ինվարանտները (փողը, գնորդը) «ճշմարտության աղբյուրը», այնպես որ պլատֆորմը կմնա ինչպես արագ, այնպես էլ հուսալի։