Αρχιτεκτονική αποθήκευσης: Redis, Memcached
Αρχιτεκτονική αποθήκευσης: Redis, Memcached
1) Πότε και γιατί κρυφή μνήμη
Στόχοι: Μείωση της καθυστέρησης, του φορτίου DB/PSP/εξωτερικών API και μετριασμός των κορυφών.
Τα στρώματα κρύπτης είναι συχνά πολυεπίπεδη: κατά τη διεργασία (L1) → επίπεδο υπηρεσίας (Redis/Memcached L2) → άκρο/CDN. Η εσωτερική κρύπτη επιταχύνει τη θερμή ανάγνωση, η L2 είναι κοινή για τις υπηρεσίες, η άκρη είναι για το δημόσιο περιεχόμενο.
2) Redis vs Memcached - Σύντομη
Κανόνας: αν χρειάζεστε πολύπλοκες δομές δεδομένων, εμμονή, παμπ/υπο/ροές/σενάρια - πάρτε 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, πλάκα ρύθμισης).
Η υπέρβαση της μνήμης θα πρέπει να υποβαθμίζεται προβλέψιμα: όχι «νόημα» στην ενεργό διαδρομή.
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, και η κρύπτη γίνεται επιταχυντής πλατφόρμας, όχι πηγή τυχαίων σταγόνων και «μυστικιστικών» σφαλμάτων.