GH GambleHub

Αρχιτεκτονική αποθήκευσης: Redis, Memcached

Αρχιτεκτονική αποθήκευσης: Redis, Memcached

1) Πότε και γιατί κρυφή μνήμη

Στόχοι: Μείωση της καθυστέρησης, του φορτίου DB/PSP/εξωτερικών API και μετριασμός των κορυφών.
Τα στρώματα κρύπτης είναι συχνά πολυεπίπεδη: κατά τη διεργασία (L1) → επίπεδο υπηρεσίας (Redis/Memcached L2) → άκρο/CDN. Η εσωτερική κρύπτη επιταχύνει τη θερμή ανάγνωση, η L2 είναι κοινή για τις υπηρεσίες, η άκρη είναι για το δημόσιο περιεχόμενο.

2) Redis vs Memcached - Σύντομη

ΚριτήριοRedisMemcached
Τύποι δεδομένωνΣυμβολοσειρές, hashes, λίστες, σύνολα, zset, bitmaps, HyperLogLog, Streams, Bloom/CF (μέσω ενοτήτων)Κλείδα αξίας (συμβολοσειρές)
ΕμμονήAOF/RDB, μη-fsync-απώλεια κατά τη ρύθμισηΌχι, δεν είναι
ΔέσμηΔέσμη Redis (sharing, failover )/SentinelΑποτρίχωση πελάτη, καμία εγγενής αποτυχία
Συναλλαγές/σενάριαMULTI/EXEC, EVAL (Lua), ατομικές λειτουργίεςΌχι, δεν είναι
TTL/έξωσηΠολιτικές βελτίωσηςΒασική
Καθυστέρηση/μνήμηΕλαφρώς περισσότερα γενικά έξοδαΠολύ ελαφρύ, προβλέψιμο

Κανόνας: αν χρειάζεστε πολύπλοκες δομές δεδομένων, εμμονή, παμπ/υπο/ροές/σενάρια - πάρτε Redis. Αν το πολύ απλό, γρήγορο, φτηνό στρώμα μνήμης KV χωρίς αντοχή είναι Memcached.

3) Μοτίβα αποθήκευσης

3. 1 Αγρανάπαυση (τεμπέλης)

Η εφαρμογή διαβάζει από την κρύπτη → μια αστοχία → διαβάζει από τη βάση δεδομένων → την τοποθετεί στην κρύπτη με TTL.

Απλός έλεγχος TTL, ανεξαρτησία μνήμης. − Πιθανή «καταιγίδα» σε περίπτωση αστοχίας.

3. 2 Ανάγνωση μέσω

Ο ίδιος ο πελάτης/διαμεσολαβητής αποσύρεται από την αρχή σε μια αστοχία και το τοποθετεί στην κρύπτη.

Συγκεντρωτική λογική.

3. 3 Διαγραφή/εγγραφή πίσω

Εγγραφή: εγγραφή πρώτα στην κρύπτη, στη συνέχεια στη βάση δεδομένων.
Γράψτε πίσω: γράφοντας στην ουρά, ασύγχρονη λάμψη στη βάση δεδομένων (πιθανή απώλεια όταν συντριβεί - χρειάζεστε ένα αρχείο καταγραφής).

3. 4 Δύο βαθμίδες (L1 + L2)

L1 (εν εξελίξει) με σύντομο TTL και μαλακό TTL, L2 (Redis/Memcached) - "cache αλήθεια. "Αναπηρία μέσω παμπ/υποβρυχίου.

4) TTL, καταιγίδες και συνέπεια

TTL-Set πλησίον της συχνότητας αλλαγής δεδομένων. Για θερμά κλειδιά, χρησιμοποιήστε την τυχαιοποίηση TTL (jitter): 'ttl = βάση ± rand (0. βάση 0. 1) "- αφαιρεί τις συγχρονισμένες εκροές.

Δόγμα (βροντή αγέλη): προστασία αστοχιών:
  • Μία πτήση: μόνο μία διαδικασία υπεργενικεύει την τιμή (βλέπε παράδειγμα Lua).
  • Soft-TTL + ανανέωση φόντου: μετά το 'soft _ ttl', δώστε το μπαγιάτικο και ενημερώστε το με το φόντο.
  • Semaphore/lock: 'πλήκτρο SET: τιμή κλειδώματος NX PX = 2000'.
  • Παράλυση: «stale-while-revalidate» για APIs απόκρισης (βλέπε παράγραφο 8).

5) Κλειδιά, χώροι ονομάτων, σειρά

5. Όνομα κλειδιού

Πρότυπο: '{domain}: {οντότητα}: {id}: {field}'

Παραδείγματα:
  • 'χρήστης: προφίλ: 42' 'κατάλογος: προϊόν: 1001: v2' '' psp: τιμές: 2025-11-03 '

Προσθήκη μιας έκδοσης σχήματος (': v2') - αυτό διευκολύνει τη μαζική αναπηρία.

5. 2 Neimspaces μέσω «διαστημικής έκδοσης»

Κρατήστε το κλειδί 'ns: κατάλογος = 17'. Πραγματικά κλειδιά: 'κατάλογος: 17: προϊόν: 1001'. Για την παγκόσμια αναπηρία καταλόγου, απλά προσαύξηση 'ns: κατάλογος'.

5. 3 Σειριακή/συμπίεση

Το JSON είναι βολικό, αλλά βαρύ. Χρήση του Message Pack/CBOR.
Ενεργοποίηση συμπίεσης (LZ4/ZSTD) για μεγάλο ωφέλιμο φορτίο (> 1-2 KB). Στο Redis - από την πλευρά του πελάτη.

6) Θερμά κλειδιά και στρίψιμο

Hot-keys: Παρακολούθηση πάνω-N από hit/miss/byte. Για εξαιρετικά καυτά κλειδιά:
  • Αναπαραγωγή μοτίβου ανάγνωσης: αντιγραφή της τιμής σε διάφορα πλήκτρα κοπής: k: 1.. N ', επιλέξτε τυχαία κατά την ανάγνωση.
  • Τοπική L1: Να λαμβάνεται υπόψη η διαδικασία συνδρομής αναπηρίας.
Βραχίονας:
  • Σμήνος Redis - εγγενής (16384 hash slots).
  • Memcached είναι μια πελατειακή πλευρά συνεπής hash.
  • Το hash-tag στο Redis '{...}' καθορίζει μια υποδοχή για ένα σύνολο κλειδιών: 'χρήστης: {42}: προφίλ' και 'χρήστης: {42}: όρια' θα είναι στην ίδια κάρτα.

7) Πολιτικές και μεγέθη πρόληψης

Redis 'maxmemory-policy': 'allkeys-lru', 'volatile-lru', 'allkeys-lfu', 'noeviction' и т. д. Για την κρύπτη, συνήθως 'allkeys-lru '/' allkeys-lfu'.
Memcached - LRU на πλάκα αντικειμένου.
Μέγεθος και τιμή κλειδιού: ρολόι για το μέγιστο μέγεθος αντικειμένου (Απομνημονευμένο εξ ορισμού 1 MB, πλάκα ρύθμισης).
Η υπέρβαση της μνήμης θα πρέπει να υποβαθμίζεται προβλέψιμα: όχι «νόημα» στην ενεργό διαδρομή.

Ρύθμιση Redis (θραύσμα):

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 cache-gield (απλουστευμένη)

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' event 'ακυρώστε: {ns}: {id}' → οι συνδρομητές διαγράφουν τα κλειδιά.
Με χρονοδιακόπτη: σύντομη TTL για συχνά μεταβαλλόμενα δεδομένα.
Έκδοση: βλέπε κλειδιά 'ns:'.
Outbox: εγγύηση παράδοσης αναπηρίας (log/θεματικό γεγονός, retrai).
Λειτουργία Cache idempotency: χρήση 'SETXX/SETNX', εκδόσεις ('etag') και πεδία hash για προσαύξηση.

10) Αντιγραφή, σύμπλεγμα, αποτυχία

10. 1 Redis

Sentinel: αυτόματο master-replica failover (status FUL IP/όνομα).
Δέσμη: αποθήκευση + αυτόματη αστοχία. οι πελάτες πρέπει να υποστηρίζουν τις ανακατευθύνσεις «MOVED/ASK».
AOF/RDB: για την κρύπτη συνήθως «appendfsync everysec», είναι δυνατό χωρίς επιμονή (όπως μια καθαρή κρύπτη).

10. 2 Υπομνήματα

Δεν υπάρχει αναπαραγωγή από το κουτί. Αξιοπιστία - μέσω shard πολλαπλών εξυπηρετητών + επανάληψη 'n' (client-side).
Όταν οι κόμβοι πέφτουν, υπάρχει μια αύξηση στις αστοχίες και «επανεκπαίδευση» της κρύπτης.

10. 3 K8s και δικτύωση

Redis/Memcached δεν αρέσει η συχνή αναδημιουργία του λοβού? Χρησιμοποιήστε Stat Set + AZ αντίποδα, σταθερό PVC/POD IP.
Ορισμός PodDisricationBudget and Topology Περιορισμοί.

11) Συναλλαγές, σενάρια και ατομικότητα (Redis)

INCR/DECR, HINCRBY - μετρητές, ποσοστώσεις, όρια συντελεστών (απλά σκεφτείτε να παραμείνετε).
MULTI/EXEC - δέσμη ατομικών εντολών.
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) Ουρές αναμονής, παμπ/υπο και ρεύματα (Redis)

Παμπ/Υπο: αναπηρία, σήματα. Όχι αποθήκευση, μόνο διαδικτυακοί ακροατές.
Streams: Reference Event Queues (ACK), Consumer Group, Retrai - βολικό για την εγγραφή/fan-outs.
Κατάλογος ('BRPOP'): απλές ουρές αναμονής.
Μην χρησιμοποιείτε το Redis ως ένα «μονό λεωφορείο των πάντων» χωρίς ένα εφεδρικό - αυτό είναι ένα cache/γρήγορο λεωφορείο, όχι το Kafka.

13) Ασφάλεια και πρόσβαση

Απομόνωση δικτύου/VPC, mTLS στο επίπεδο εισόδου, ACL/κωδικοί πρόσβασης ('requirepass '/ACL in Redis 6 +).
Απενεργοποίηση επικίνδυνων εντολών στο Redis ('CONFIG', 'FLUSHALL', 'KEYS') μέσω ACL.
Για Memcached - μην ακούτε δημόσιες διεπαφές, '-U 0' (χωρίς UDP), μόνο ιδιωτικά δίκτυα.
Μην φυλάσσετε το PII; εάν είναι απαραίτητο - σύντομη κρυπτογράφηση TTL + σε επίπεδο εφαρμογής.

14) Παρατηρησιμότητα και συντήρηση

Βασικές μετρήσεις:
  • Αναλογία Hit/αναλογία Miss (κατά χώρο ονομάτων/διαδρομή).
  • Latency p95/p99 'GET/SET/MGET' εντολές, χρονοδιαγράμματα.
  • Εξώσεις и σφάλματα OOM.
  • Καθυστέρηση αντιγραφής (Redis), κατάσταση διασποράς, περιστατικά μετανάστευσης/επανασύνδεσης.
  • Πλήκτρα άνω-Ν με κίνηση/ψηφιολέξεις (δειγματοληψία).
  • Αρχεία καταγραφής: αργές εντολές ('slowlog'), σφάλματα δικτύου.
  • Dashboards: γενικά (CPU/RAM/συνδέσεις), εντολές, χρονοθυρίδες συστάδων, φρουροί, που διέρχονται από τους εξαγωγείς του Προμηθέα.

15) Σχηματισμοί και εφαρμογές - παραδείγματα

15. 1 Redis Sentinel (snippet)


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 (τιμές πηδαλίου, απλουστευμένη)

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

15. 3 Memcached (εγκατάσταση)

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) Αντι-μοτίβα

Φυλάσσετε την «αλήθεια» στο Redis χωρίς AOF/RDB και χωρίς απόλυση.
TTL = 0 (αέναο) για πτητικά δεδομένα → αέναη ασυνέπεια.
Μάζα 'KEYS' in prod.
Απουσία νευρικότητας/soft-TTL → συγχρονισμένες διακοπές και καταιγίδες.
Ένα παράδειγμα για όλες τις εντολές χωρίς σχηματισμούς/αντίγραφα.
Χρήση Memcached για εργασίες που απαιτούν ατομικότητα/σενάρια.

18) Κατάλογος ελέγχου εφαρμογής (0-45 ημέρες)

0- 10 ηµέρες

Επιλέξτε ένα πρότυπο (cache-jure + L1/L2), περιγράψτε τα κλειδιά, TTL, χώρους ονομάτων.
Ενεργοποίηση νευρώσεων/μαλακών TTL, μονής πτήσης. βασικές καταχωρίσεις/πίνακες ταμπλό.
Για το Redis - ρυθμίστε ACL, προστατευόμενη λειτουργία, αργοπορία, maxmemory-policy.

11-25 ημέρες

Μετάβαση σε κομματάκι (σύμπλεγμα Redis ή hash πελάτη), αντίγραφα.
Αναπηρία μέσω της έκδοσης pub/sub ή neimspace. outbox στη βάση δεδομένων.
Δοκιμές φορτίου «επανεκπαίδευσης» στην κρύπτη· τον περιορισμό της καταγωγής.

26-45 ημέρες

Autopromo/canary TTL, προθέρμανση πριν την απελευθέρωση.
Ροές για επανασυναρμολόγηση γραμμής/φόντου.
Εβδομαδιαίες αναφορές για το hit-ratio, τα κορυφαία κλειδιά, το κόστος μνήμης.

19) Μετρήσεις διάρκειας

Λόγος επιτυχίας L2 ≥ 80% (στατιστικές για διαδρομές/χώρους ονομάτων).
GET <2-3 ms (in-DC), αστοχεί <προέλευσης SLO.
0 καταιγίδες μαζικής αναπηρίας (αποδεικνύεται με δοκιμές).
Αυτόματη έκδοση αναπηρίας και nymspace.
Η μετατόπιση/αναπαραγωγή καλύπτει 1 αστοχία κόμβου χωρίς σημαντική υποβάθμιση.

20) Συμπέρασμα

Ισχυρή αρχιτεκτονική κρυφής μνήμης είναι η πειθαρχία των κλειδιών και TTL, προστασία θύελλας, σωστή βραχυκύκλωση, και προβλέψιμη προφύλαξη. Redis δίνει πλούσια σημασιολογία, επιμονή και ατομικότητα? Memcached - μέγιστη απλότητα και ταχύτητα. Προσθέστε παρατηρησιμότητα, αναπηρία γεγονότων, L1 + L2, και η κρύπτη γίνεται επιταχυντής πλατφόρμας, όχι πηγή τυχαίων σταγόνων και «μυστικιστικών» σφαλμάτων.

Contact

Επικοινωνήστε μαζί μας

Επικοινωνήστε για οποιαδήποτε βοήθεια ή πληροφορία.Είμαστε πάντα στη διάθεσή σας.

Telegram
@Gamble_GC
Έναρξη ολοκλήρωσης

Το Email είναι υποχρεωτικό. Telegram ή WhatsApp — προαιρετικά.

Το όνομά σας προαιρετικό
Email προαιρετικό
Θέμα προαιρετικό
Μήνυμα προαιρετικό
Telegram προαιρετικό
@
Αν εισαγάγετε Telegram — θα απαντήσουμε και εκεί.
WhatsApp προαιρετικό
Μορφή: κωδικός χώρας + αριθμός (π.χ. +30XXXXXXXXX).

Πατώντας «Αποστολή» συμφωνείτε με την επεξεργασία δεδομένων.