Logo GH

ארכיטקטורת מטמון: 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

צרו קשר

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

התחלת אינטגרציה

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

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

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