कैचिंग रणनीतियाँ
1) कैश क्यों और इसे कहां करना है
कैश एक तेज स्मृति परत है जो महंगे संसाधनों (सीपीयू/डीबी/बाहरी एपीआई) पर विलंबता और लोड को कम करती है। महत्वपूर्ण लक्ष
गति (p95/p99 कम), लागत (कम egress/CPU), स्थिरता (शिखर के नीचे कम निर्भरता)।
पीक चिकनाई और "शोर पड़ोसियों" से अलगाव।
विशिष्ट स्तर:1. क्लाइंट (ब्राउज़र/मोबाइल) - HTTP कैश, IndexedDB, स्थानीय भंडारण।
2. एज/सीडीएन - पीओपी नोड्स उपयोगकर्ता, कैश स्थिर और एपीआई के हिस्से के करीब हैं।
3. L7-gateway/Reverse-proxy - Nginx/Envoy/Varnish (माइक्रोकैश, SWR)।
4. सेवा कैश - रेडिस/मेमकैच क्लस्टर के भीतर।
5. इन-प्रोसेस - इन-मेमोरी (कैफीन/गुवा/एलआरयू-मैप)।
6. डेटाबेस में कैश - भौतिक अभ्यावेदन, द्वितीयक सूचकांक।
नियम: कैश जितना संभव हो उतना उपभोक्ता के करीब हो, लेकिन सच्चाई को एक बार रखें।
2) कैश पैटर्न
2. 1 कैश-एक तरफ ("आलसी लोडिंग")
आवेदन पहले कैश से पढ़ ता है; एक मिस के मामले में - स्रोत से, फिर कैश को लिखते हैं।
पेशेवरों: सादगी, नियंत्रण। विपक्ष: ठंड शुरू होती है, बेमेल खिड़कियां।
2. 2 पढ़ ने के माध्यम से
पढ़ ना हमेशा कैश के माध्यम से होता है, जो स्वयं स्रोत पर जाता है जब यह याद आता है (पुस्तकालय/प्रॉक्सी परत)।
टीटीएल/धारावाहिक नीतियों को केंद्रीकृत करना सुविधाजनक है।
2. 3 राइट-थ्रू/राइट-बैक (राइट-पीछे)
राइट-थ्रू: कैश और स्रोत पर तुल्यकालिक रूप से लिखें - स्थिरता उच्च, विलंबता उच्च।
राइट-बैक: कैश पर लिखें, अतुल्यकालिक फ्लैश स्रोत पर लिखें - तेजी से, लेकिन नुकसान और संघर्ष का जोखिम।
2. 4 रिफ्रेश-फॉरवर्ड (सक्रिय)
"टीटीएल जल्द ही समाप्त हो जाएगा" की भविष्यवाणी करता है और भगदड़ को रोकते हुए पृष्ठभूमि में कुंजी को अपडेट करता है।
2. 5 नकारात्मक कैशिंग
एक छोटे टीटीएल को "कोई डेटा/404/खाली" कैचिंग करने से स्रोत पर लोड कम हो जाता है।
2. 6 माइक्रो-कैशिंग
बहुत छोटा टीटीएल (0। 5-5 एस) "लगभग गतिशीलता" (सूची, मुख्य) के लिए L7 पर - तेजी से पूंछ को कम करता है।
3) HTTP कैश: हेडर और नियंत्रण
3. 1 मूल शीर्षक
'कैश-कंट्रोल': 'मैक्स-एज', 'एस-मैक्सेज' (для साझा кэшей), 'पब्लिक/प्राइवेट', 'नो-स्टोर', 'स्टेल-जबकि-रिवाइवल', 'स्टेल-इफ-एरर'।
Validators: 'ETag' (सामग्री हैश), 'अंतिम-संशोधित'।
शर्तों के साथ प्रश्न: 'इफ-नो-मैच', 'इफ-मॉडिफाइड-फ्रॉम' → 304 संशोधित नहीं।
3. 2 भिन्न और चाबियाँ
'वैरी: स्वीकार-एनकोडिंग, प्राधिकरण, कुकी, स्वीकार-भाषा' - विभिन्न कैश विकल्प उत्पन्न करता है। 'वैरी' को कम से कम करें ताकि कार्डिनैलिटी को "उड़ाया" न जाए।
3. 3 HTTP प्रतिक्रिया उदाहरण
Cache-Control: public, max-age=60, s-maxage=300, stale-while-revalidate=60
ETag: "a1b2c3"
Vary: Accept-Encoding
4) मुख्य डिजाइन और टीटीएल
4. 1 कुंजियाँ
संरचना: 'किरायेदार: उपयोक्ता: {id}: प्रोफ़ाइल: v3' (स्कीमा संस्करण शामिल करें).
कुंजी में पीआईआई से बचें।
संग्रह के लिए - कुंजी + क्वेरी पैरामीटर (सामान्यीकृत और क्रमबद्ध)।
4. 2 टीटीएल और स्थिरता
एक छोटा टीटीएल बेमेल को कम करता है लेकिन यादों को बढ़ाता है।
महत्वपूर्ण डेटा के लिए - सत्यापन ('ईटीएजी') और एसडब्ल्यूआर (बासी-जबकि-पुनर्नवीनीकरण)।
शायद ही कभी बदलने के लिए - विकलांगता के लंबे टीटीएल + "बम"।
4. 3 वर्शनिंग/बेस्टिंग
असंगत परिवर्तनों के लिए, उपसर्ग/कुंजी संस्करण ('v2 → v3') बदलें।
स्थिर संसाधनों के लिए - फ़ाइल नाम में सामग्री हैश।
5) विकलांगता: रणनीति और प्रथाएं
5. 1 प्रत्यक्ष विलोपन
'DEL कुंजी '/' PURGE' प्रॉक्सी। खतरा: हटाने और कई पाठकों के बीच दौड़।
5. 2 सरोगेट कुंजियाँ
दस्तावेज़ को टैग के सेट (श्रेणी/लेखक) से जोड़ें। विकलांगता - टैग द्वारा।
В वार्निश/एज - 'सरोगेट-की: लेख: 42 टैग: लेखक: 7' + 'BAN टैग: लेखक: 7'।
5. 3 घटना-चालित विकलांगता
पब/सब (काफ्का/एनएटीएस): जब स्रोत बदलता है, तो हम "अमान्य" घटना प्रकाशित करते हैं।
कैश उपभोक्ता सुनते हैं और हटाते हैं/अपडेट करते हैं।
5. 4 दो चरण
सबसे पहले, हम कुंजी अप्रचलित (नरम टीटीएल) को चिह्नित करते हैं, बासी की सेवा करते हैं, इसे पृष्ठभूमि में अद्यतन करते हैं और परमाणु रूप से इसे बदलते हैं।
6) भगदड ़/डॉगपाइल और गर्म चाबियों से निपटना
6. 1 अनुरोध colessing (एकल फ्लाइट)
एक निर्माता कुंजी को अपडेट करता है, बाकी परिणाम की प्रतीक्षा कर रहे हैं (म्यूटेक्स/लेबल "अपडेट")।
6. 2 जिटर к टीटीएल
तुल्यकालिक सूजन से बचने के लिए टीटीएल में यादृच्छिकता ( 10-20%) जोड़ें।
6. 3 सॉफ्ट-टीटीएल + हार्ड-टीटीएल
सॉफ्ट-टीटीएल से पहले, हम कैश से सेवा करते हैं, ताज़ा ट्रिगर के समानांतर; हार्ड-टीटीएल द्वारा - हम एक मिस मानते हैं।
6. 4 गर्म कुंजियाँ
साझा किए गए (दो-स्तरीय) पर स्थानीय कैश।
कई शार्क और यादृच्छिक चयन के लिए गर्म-कुंजी प्रतिकृति (केवल पढ़ें)।
किसी विशिष्ट कुंजी को अद्यतन करने के लिए दर सीमा
6. Redis + Lua का 5 उदाहरण (एकल-स्केच)
lua
-- SETNX lock with TTL to avoid deadlocks local ok = redis. call("SET", KEYS[1], "1", "NX", "EX", ARGV[1])
if ok then return "LOCKED"
else return "WAIT"
end
7) प्रीमेशन पॉलिसी और कैश रिसेप्शन
7. 1 निष्कासन
LRU: इलाके के लिए सरल और अच्छा।
LFU: "लंबे समय तक जीवित" गर्म चाबियों के लिए बेहतर।
ARC/TinyLFU: पुनरावृत्ति/आवृत्ति संतुलन।
7. 2 प्रवेश
विशाल दुर्लभ वस्तुओं (TinyLFU/ब्लूम फिल्टर) में न जाने दें।
आकार/विलंबता सीमा पर बड़े मूल्यों (LZ4/Zstd) का संपीड़न।
8) चार्डिंग और टोपोलॉजी
8. 1 लगातार हैशिंग
नोड्स को चाबियाँ वितरित करता है, क्लस्टर विकास/संपीड़न के दौरान आंदोलन को कम करता है।
8. 2 रेडिस/मेमकैच्ड टोपोलॉजी
रेडिस क्लस्टर (स्लॉट/शार्ड्स), सेंटिनल (फीलओवर), रीड-ओनली प्रतिकृति।
Memcatched सर्वर-स्तर की प्रतिकृति के बिना एक क्लाइंट-साइड शार्डिंग (केतमा हैशिंग) है।
8. 3 स्थानीय + वितरित
कैस्केड: इन-प्रोक (माइक्रो-टीटीएल/एलआरयू) → रेडिस (टीटीएल लंबा) → स्रोत।
TTL कॉलोनियों और कैश वेलिडेटर्स के साथ सावधान रहें।
9) एज, सीडीएन और एल 7 कैश
9. 1 माइक्रो-कैश на Nginx
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api:100m inactive=10m;
map $request_method $skip_cache { default 0; POST 1; PUT 1; DELETE 1; }
server {
location /api/list {
if ($skip_cache) { add_header Cache-Control "no-store"; }
proxy_cache api;
proxy_cache_valid 200 2s; # micro-cache proxy_cache_use_stale error timeout updating;
proxy_cache_background_update on; # SWR add_header X-Cache $upstream_cache_status;
proxy_pass http://upstream;
}
}
9. 2 दूत (एसडब्ल्यूआर और शर्तें)
yaml http_filters:
- name: envoy. filters. http. cache typed_config:
"@type": type. googleapis. com/envoy. extensions. filters. http. cache. v3. CacheConfig typed_config:
"@type": type. googleapis. com/envoy. extensions. http. cache. file_system_http_cache. v3. FileSystemHttpCacheConfig cache_path: "/var/cache/envoy"
9. 3 वार्निश (सरोगेट कुंजी)
बैच विकलांगता के लिए टैग पर 'सरोगेट-कुंजी' और 'प्रतिबंध' का उपयोग करें।
10) कैश और डेटा स्थिरता
10. 1 पढ़ें-आपके लिखे
उपयोगकर्ता प्रोफाइल/रीसायकल बिन के लिए, या तो लघु टीटीएल, राइट-थ्रू, या क्लाइंट मार्किंग (लिखने के बाद एन सेकंड के लिए बाईपास) प्रदान करें।
10. 2 अंतिम बनाम मजबूत
सिफारिशी/विश्लेषणात्मक - अंतिम + लंबे टीटीएल के लिए।
पैसे/ऑर्डर स्टेटस के लिए - छोटा टीटीएल, सत्यापन, कभी-कभी महत्वपूर्ण रास्तों पर कैश के बिना।
10. 3 अपरिवर्तनीय
बिना सख्त टीटीएल और पुनः सत्यापन के सुरक्षा/एसीएल को प्रभावित करने वाले क्षेत्रों को कैश न करें.
11) अवलोकन, एसएलओ और प्रबंधन
11. 1 मेट्रिक्स
hit_ratio (общий и प्रति-मार्ग), byte_hit_ratio, miss_rate।
, , , ।
लेटेंसी: स्रोत से कैश बनाम से p50/p95/p99।
hot_keys_topN और उनके QPS/बाइट्स।
11. 2 लॉग और निशान
लॉग 'X-Cache: HIT/MISS/STALE/UPDATING'।
निशान में, प्रतिक्रिया के स्रोत को चिह्नित करें ('कैश = सही', 'टियर = एज' सेवा 'स्थानीय')।
11. 3 एसएलओ दृष्टिकोण
उदाहरण: "API/कैटलॉग p99 ≤ 250 ms के लिए, कैश ≥ 85% हिट, भगदड़ ≤ 0। 1% अनुरोध।"
11. 4 रनबुक
"मिसेज ग्रोथ" - टीटीएल, वार्म-अप/विकलांगता, हॉट-कीज़, कैश आकार और स्वीकृति नीति की जाँच करें।
12) सुरक्षा और बहु-किरायेदारी
कुंजियों में एम्बेड किरायेदार-आईडी (और HTTP के लिए 'Vary' में)।
निजी प्रतिक्रियाओं को 'सार्वजनिक' के रूप में कैश न करें।
संवेदनशील डेटा के साथ कैश एनक्रिप्ट करें या सिर्फ गैर पीआईआई/आईडी संग्रहीत करें।
13) विशिष्ट व्यंजनों
13. 1 कैटलॉग/टेप (लगभग गतिशील)
एज-माइक्रोकैश 1-3 एस + एसडब्ल्यूआर, अंदर - 15-60 एस के लिए रेडिस, अद्यतन घटनाओं द्वारा विकलांगता।
13. 2 उपयोगकर्ता प्रोफ़ाइल
TTL 30-120 s के साथ कैश-अलग, प्रोफाइल अपडेट (कुकी/हेडर), या राइट-थ्रू के बाद 5-10 s को बायपास करें।
13. 3 मुद्रा पाठ्यक्रम/संदर्भ पुस्त
नया डेटा प्रकाशित होने पर लंबा टीटीएल (मिनट-घंटे) + लक्ष्य विकलांगता; सशर्त GETs के लिए 'ETag'।
13. 4 खोज परिणाम
एज-माइक्रोकैश 1-2 एस, अंदर - रिफ्रेश-फॉरवर्ड और कोलसिंग, कुंजी में क्वेरी मापदंडों का सामान्यीकरण।
14) एंटी-पैटर्न
विकलांगता के बिना नकदी: केवल टीटीएल के लिए आशा है → अप्रासंगिकता की लंबी खिड़कियां।
विशालकाय 'वैरी': विकल्पों का "विस्फोट" - कम हिट-रेट।
प्रोड/प्रयोगों के लिए एकल कैश - संदूषण।
टीटीएल समाप्त होने पर भगदड़ के खिलाफ कोई सुरक्षा नहीं।
सख्त गारंटी के बिना नकद/अधिकार/एसीएल कैश।
"एक पंक्ति में सब कुछ" का संपीड़न - अतिरिक्त सीपीयू, छोटी वस्तुओं पर पी 99 की गिरावट।
15) कार्यान्वयन चेकलिस्ट
- कैश स्तर और उनके लक्ष्य (किनारे/सेवा/स्थानीय) को परिभाषित करें।
- डिजाइन कुंजियाँ (वर्शनिंग, किरायेदार, पैरामीटर सामान्यीकरण)।
- पैटर्न चुनें (कैश-एक तरफ/रीड-थ्रू/रिफ्रेश-फॉरवर्ड)।
- टीटीएल/सॉफ्ट-टीटीएल/जिटर कॉन्फ़िगर करें, एसडब्ल्यूआर सक्षम करें।
- कोलसिंग/सिंगलफ्लाइट, भगदड़ संरक्षण को लागू करें।
- विकलांगता (घटनाओं, टैग, पर्स/प्रतिबंध) का आयोजन करें।
- हिट-अनुपात/विलंबता मेट्रिक्स और 'एक्स-कैश' डैशबोर्ड दर्ज करें।
- गर्म कुंजी लोड परीक्षण करें।
- एसएलओ और रनबुक लिखें।
- सुरक्षा/किरायेदार अलगाव और 'वैरी' की जाँच करें।
16) एफएक्यू
प्रश्न: क्या चुनना है - कैश-अलग या रीड-थ्रू?
A: सरल सेवाओं के लिए - कैश-एक तरफ। हमें केंद्रीकरण और एकल नीति - रीड-थ्रू की आवश्यकता है।
प्रश्न: इष्टतम टीटीएल को कैसे समझें?
A: अनुमेय अप्रचलन, अपडेट की आवृत्ति और लक्ष्य हिट-दर से शुरू करें; जिटर जोड़ें और p95/p99/लागत का निरीक्षण करें।
प्रश्न: राइट-बैक कब उपयुक्त है?
A: उच्च-लोड धाराओं के लिए, जहां अंततः स्थिरता स्वीकार्य है और "जोड़ने" के लिए एक विश्वसनीय कतार/लॉग है।
प्रश्नः क्या अधिकृत प्रतिक्रियाओं को कैश किया जा सकता है?
A: हाँ, लेकिन 'निजी' और/या किरायेदार/उपयोगकर्ता को/' वैरी 'स्विच में शामिल करें। वास्तव में-निजी - ग्राहक कैश के लिए।
प्रश्न: कैश को कैसे गर्म करें?
A: लोकप्रिय कुंजियों की सूची, पृष्ठभूमि वर्मर, लॉग से रिप्ले, रिलीज/पीक (ब्लैक फ्राइडे, आदि) से पहले वार्मिंग।
17) कुल
प्रभावी कैशिंग कुंजी डिजाइन + उचित टीटीएल + एक अच्छी तरह से चुना गया पैटर्न है, जो घटना विकलांगता, एसडब्ल्यूआर/रिफ्रेश-फॉरवर्ड और भगदड़ सुरक्षा द्वारा बढ़ाया गया है। कैश टीयर (क्लाइंट/एज/सर्विस), वेधशाला और एसएलओ जोड़ें - और स्थिर विलंबता पूंछ, अनुमानित लागत और शिखर लचीलापन प्राप्त करें।