GH GambleHub

ארכיטקטורת מטמון: Redis, Memcased

ארכיטקטורת מטמון: Redis, Memcased

1) מתי ולמה מטמון

מטרות: להפחית איחור, לפרוק DB/PSP/API ופסגות מקלות.
שכבות מטמון הן לרוב רב-שכבתיות: בתהליכים (L1) * רמת השירות (Redis/Memcached L2) * edge/CDN. המטמון הפנימי מאיץ קריאות חמות, L2 נפוץ עבור שירותים, הקצה הוא עבור תוכן ציבורי.

2) Redis vs. Memcased - קצר

קריטריוןרדיסממוזכר
סוגי נתוניםמחרוזות, חשיש, רשימות, סטים, zset, מפות סיביות, HyperLoglog, Streams, Blom/CF (באמצעות מודולים)מפתח ערך (מחרוזות)
התמדהAOF/RDB, ללא-fsync-loss בעת הגדרותלא, זה לא
אשכולאשכול רדיס (מחודד, כשל )/סנטינלרסיס לקוח, אין כשל מקומי
עסקאות/תסריטיםMULTI/EXEC, EVAL (לואה), פעולות אטומיותלא, זה לא
TTL/פינוימדיניות מתכווננת היטבבסיסי
Latency/memoryקצת יותר תקורהמאוד קל, צפוי

חוק: אם אתה צריך מבני נתונים מורכבים, התמדה, פאב/תת/זרמים/סקריפטים - קח את רדיס. אם שכבת מטמון KV סופר פשוטה, מהירה וזולה ללא עמידות היא Memcased.

3) דפוסי מטמון

3. 1 מטמון בצד (עצלן)

היישום קורא מהמטמון. * החטאה = קריאה מתוך מסד הנתונים.

בקרת TTL פשוטה, עצמאות מטמון.

3. 2 קריאה דרך

הלקוח/פרוקסי עצמו מושך ממקור בהחטאה ושם אותו במטמון.

היגיון מרוכז, תשתית מורכבת יותר.

3. 3 כתיבה/כתיבה מאחור

כתיבה דרך: כתיבה ראשונה למטמון, ולאחר מכן לבסיס הנתונים.
כתוב מאחור: כתיבה לתור, הבזק אסינכרוני בבסיס הנתונים (אובדן פוטנציאלי בעת התרסקות - אתה צריך יומן).

3. 4 שתי שכבות (L1 + L2)

L1 (בתהליך) עם TTL קצר ו-TTL רך, L2 (Redis/Memcached) - "אמת מטמון. "נכות דרך פאב/משנה.

4) TTL, סערות ועקביות

TTL-Set קרוב לתדר של שינוי הנתונים. עבור מפתחות חמים, השתמש ב ־ TTL (jitter) אקראי: tl = base ingrand (0. Base0. 1) מסיר זרימות סינכרוניות.

ערימת כלבים (עדר רועם):
  • Singleflight: רק תהליך אחד מגדיר יתר על המידה את הערך (ראה דוגמה של Lua).
  • רענון רך-TTL + רקע: לאחר 'רך _ tl', לתת לו מעופש ולעדכן עם הרקע.
  • Semaphore/lock: ”SET key: lock value NX PX = 2000”.
  • כמעט מיושן: ”מעופש בזמן מחדש” עבור API תגובה (ראה סעיף 8).

5) מפתחות, אספות שם, סריאליזציה

5. שם מפתח 1

תבנית: ”דומיין” (ישות): דוגמאות:
  • 'user: פרופיל: 42' 'קטלוג: מוצר: 1001: v2' psp: תעריפים: 2025-11-03&pos

הוסף סכימה (': v2') - זה מקדם נכות המונית.

5. 2 מרחבי נימוסין באמצעות ”גרסת חלל”

החזק את המפתח 'ns: קטלוג = 17'. מפתחות אמיתיים: ”קטלוג: 17: מוצר: 1001”. עבור לקות ספרייה גלובלית, פשוט להעלות 'ns: קטלוג'.

5. 3 סריאליזציה/דחיסה

ג 'סון הוא נוח, אבל כבד. השתמש ב ־ Breash Pack/CBOR.
אפשר דחיסה (LZ4/ZSTD) עבור מטען גדול (> 1-2 KB). ברדיס - בצד הלקוח.

6) מפתחות חמים וחדות

צג למעלה-N על ידי להיט/מיס/בייט. עבור מפתחות חמים ביותר:
  • דפוס קריאה משוכפל: לשכפל את הערך בכמה מפתחות רסיס 'חם: k: 1.. N ', לבחור אקראי בעת קריאה.
  • L1 מקומי: זכור את תהליך מנוי הנכות. ‏
שארדינג:
  • רדיס קלאסטר - יליד (16384 חריצי חשיש).
  • Memcased הוא חשיש עקבי בצד לקוח.
  • Hash-tag ברדיס '...' מתקן חריץ עבור סט מפתחות: 'משתמש:': '42': פרופיל 'ו' משתמש ':' 42 ': גבולות' יהיה על אותו כרטיס.

7) מדיניות מניעה וגדלים

Redis 'maxmemory-policy': 'all keys-lru', 'הפכפך-lru', 'allkeys-lfu', 'noiciation' bustlac. д. למטמון, בדרך כלל 'alkeys-lu '/' allkeys-lfu'.
ממוזכר - LRU אתמול לוח פריטים.
גודל וערך מפתח: שים לב לגודל מקסימלי של פריט (Memcamed by default 1 MB, tuning lab).
מעבר לזיכרון צריך להתבזות באופן צפוי: לא ”לא פינוי” בנתיב הפעיל.

הגדרות רדיס (שבר):

maxmemory 32gb maxmemory-policy allkeys-lfu hz 50 tcp-keepalive 60

8) דפוסי הגנה מפני סערות - קוד

8. 1 Redis Lua singleflight (פסאודו)

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 צומת. js מטמון-בצד (מפושט)

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) נכות וקוהרנטיות

על ידי אירוע: כאשר משתנים במסד הנתונים, פרסמו את ”אירוע פאב/סאב” (pub/sub) לא חוקי: (ns):
  • על ידי טיימר: TTL קצר לשינויים תכופים בנתונים.
  • ורסיונינג: ראה: 'ns:' מפתחות.
  • Outbox: ערבות להעברת נכות (אירוע רישום/נושא, רטריי).
  • פעולות מטמון idempotency: השתמש ב- ”SETXX/SETNX”, גרסאות (”etag”) ושדות חשיש לגידול.

10) שכפול, אשכול, כשל

10. 1 רדיס

סנטינל: כשל אוטומטי בהעתק מאסטר (FUL IP/name).
אשכול: שריטה + כשל אוטומטי; הלקוחות חייבים לתמוך בהפניות נעות.
AOF/RDB: עבור מטמון בדרך כלל 'appendfsync eversec', זה אפשרי ללא התמדה (כמו מטמון טהור).

10. 2 ממוזכר

אין שכפול מהקופסה. אמינות - באמצעות רסיס רב שרת + חוזר 'n' (צד לקוח).
כאשר הצמתים נופלים, יש עלייה בהחמצות ו ”אימון מחדש” של המטמון.

10. 3 K8s ורשתות

Redis/Memcashed לא אוהבים את היצירה התכופה של תרמילים; השתמש באנטי-פודים StatCet + AZ, קבוע PVC/POD IP.
הגדרת תקציב PodGood ואילוצי טופולוגיה.

11) עסקאות, תסריטים ואטומיציה (רדיס)

INCR/DECR, HINCRBY - דלפקים, מכסות, מגבלות קצב (רק לשקול להתמיד).
צרור של פקודות אטומיות.
Lua (EVAL) - לקרוא-לשנות-לכתוב ללא מירוץ.
צינור - מקטין את RTT (במיוחד בכפיפות לרשת).

דוגמה להגבלת קצב (דלי מסומן, מפושט):
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) תורים, פאב/תת ונחלים (רדיס)

פאב/סאב: נכות, אותות. אין חיסכון, מאזינים באינטרנט בלבד.
זרמים: תורים של אירוע אישור (ACK), קבוצת צרכנים, Retrai - שימושי לכתיבה מאחור/מאווררים.
רשימות (BRPOP): תורים פשוטים.
אל תשתמש ברדיס כ ”אוטובוס יחיד לכל דבר” ללא גיבוי - זהו מטמון/אוטובוס מהיר, לא קפקא.

13) ביטחון וגישה

בידוד רשת/VPC, mTLS ברמת הכניסה, ACL/סיסמאות ('דרישה pass'/ACL in Redis 6 +).
בטל פקודות מסוכנות ברדיס ('קונפיג', 'FLUSHALl',' מפתחות ') באמצעות ACL.
עבור Memcased - אל תקשיבו לממשקים ציבוריים, '-U 0' (ללא UDP), רק רשתות פרטיות.
אל תאחסן מח "ש; במידת הצורך - הצפנת TTL + קצרה ברמת היישום.

14) יכולת תצפית ותחזוקה

מדדי מפתח:
  • יחס להיט/מיס (על ידי שם/מסלול).
  • פקודות latency p95/p99 'GET/SET/MGET', פסקי זמן.
  • שגיאות של הפינוי.
  • lag שכפול (רדיס), מצב אשכול, להגר/מחדש אירועים.
  • מפתחות טופ-N על ידי תנועה/בייטים (דגימה).
  • יומנים: פקודות איטיות (”איטי לוג”), שגיאות רשת.
  • לוחות מחוונים: כללי (CPU/RAM/חיבורים), פקודות, חריצים אשכול, זקיפים, עובר דרך יצואני פרומתאוס.

15) תצורות ופריסות - דוגמאות

15. 1 רדיס סנטינל (קטע)


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 (ערכי הגה, פשט)

yaml cluster:
enabled: true nodes: 6  # 3 masters + 3 replicas persistence:
size: 100Gi resources:
requests: { cpu: "500m", memory: "2Gi" }

15. 3 Memcased (פריסה)

yaml containers:
- image: memcached:1. 6 args: ["-m", "32768", "-I", "2m", "-v", "-t", "8", "-o", "modern"]
ports: [{ containerPort: 11211 }]

15. 4 NGINX בתור פרוקסי קריאה (לולאת API)

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) בדיקות ושערים

פרופילים של מטמון קר/חם/חם.
הזרקת החטאים (טיהור בהמוניהם) - המוצא חייב לעמוד ב ”הכשרה מחדש”.
התראות: ירידה חדה ביחס להיט, עלייה באיחור החטאה, מפולת של פינוי, עלייה בפסקי זמן.

17) אנטי דפוסים

לאחסן ”אמת” ברדיס ללא AOF/RDB וללא יתירות.
TTL = 0 (נצחי) עבור נתונים תנודתיים * חוסר עקביות תמידי.
המוני 'מפתחות' בדרבן.
היעדר ג 'יטר/רך-TTL * הפסקות סינכרוניות וסערות.
מקרה אחד לכל הפקודות ללא רסיסים/העתקים.
השתמש ב ־ Memced למשימות הדורשות אטומיציה/תסריטים.

18) רשימת יישומים (0-45 ימים)

0-10 ימים

בחר תבנית (מטמון בצד + L1/L2), תאר מפתחות, TTL, אספקטים.
אפשר jitter/soft-TTL, singleflight; התראות בסיסיות/לוחות מחוונים.
עבור Redis - הגדרת ACL, מצב מוגן, לוג איטי, מקסמורי-מדיניות.

11-25 ימים

עבור לחדד (רדיס קלאסטר או חשיש לקוח), העתקים.
נכות באמצעות פאב/תת או גירסת נימספייס; תיבת יוצא במסד הנתונים.
מטמון ”אימון מחדש” בדיקות טעינה; מגביל את המוצא.

26-45 ימים

אוטופרומו/צינורית TTL, חימום לפני השחרור.
זרמים לכתיבה מאחור/רקע הרכבה מחדש.
דיווחים שבועיים על יחס להיט, מפתחות עליונים, עלות זיכרון.

19) מדדי בגרות

יחס הלהיט L2 - 80% (סטטיסטיקות על מסלולים/שמות).
P95 GET <2-3 ms (in-DC), מתגעגע <SLO המקור.
0 סערות בנכות המונית (מוכחת על ידי בדיקות).
נכות אוטומטית וארוחת לילה.
כיווץ/שכפול מכסה 1 כשל הצומת ללא השפלה ראויה להערכה.

20) מסקנה

ארכיטקטורת מטמון חזקה היא המשמעת של מפתחות וטי-טי-אל, הגנה על סערות, פירוק נכון, והנעה מקדימה צפויה. רדיס נותן סמנטיקה עשירה, התמדה ואטומיות; ממוזכר - פשטות ומהירות מקסימלית. הוסף יכולת תצפית, לקות אירוע, L1 + L2, והמטמון הופך למאיץ פלטפורמה, לא מקור לטיפות מקריות ובאגים ”מיסטיים”.

Contact

צרו קשר

פנו אלינו בכל שאלה או צורך בתמיכה.אנחנו תמיד כאן כדי לעזור.

Telegram
@Gamble_GC
התחלת אינטגרציה

Email הוא חובה. Telegram או WhatsApp — אופציונליים.

השם שלכם לא חובה
Email לא חובה
נושא לא חובה
הודעה לא חובה
Telegram לא חובה
@
אם תציינו Telegram — נענה גם שם, בנוסף ל-Email.
WhatsApp לא חובה
פורמט: קידומת מדינה ומספר (לדוגמה, +972XXXXXXXXX).

בלחיצה על הכפתור אתם מסכימים לעיבוד הנתונים שלכם.