कैश करने का एक से अधिक तरीका है।
सशर्त जी.ई.टी.
यदि आप इन छवियों को फ़ाइल सिस्टम पर संग्रहीत कर रहे हैं और उन्हें सीधे वेब सर्वर के माध्यम से सेवा दे रहे हैं, तो आप शायद पहले से ही सशर्त प्राप्त कर रहे हैं । वेब सर्वर स्वचालित रूप से एक ईटीएजी हेडर सेट करने के लिए फाइल सिस्टम मेटाडेटा का उपयोग करेगा, और यदि ब्राउज़र अपने अनुरोध में शामिल करता है If-Modified-Since
या स्वचालित रूप से "304 नहीं संशोधित" के साथ जवाब देगा If-Matches
। (सभी ब्राउज़र्स होंगे)
इस मामले में पूरी छवि वापस नहीं दी गई है, इसलिए आपके पास बैंडविड्थ की बचत है। हालाँकि, एक GET अनुरोध अभी भी जारी किया जाएगा, इसलिए आपके पास अभी भी अनुरोध का ओवरहेड और विलंबता होगा।
आप अपने वेबसर्वर सेट Cache-Control
हेडर को public,max-age=N
अपनी छवियों के लिए एक मूल्य के साथ कैश ताजगी की कीमत पर अनुरोधों की संख्या को थोड़ा कम कर सकते हैं । यह कहता है कि कैश max-age
को अपडेट करने से पहले संसाधन को सबसे अधिक सेकंड तक रख सकते हैं ।
हालांकि, HTTP कैशे प्रविष्टि को अमान्य करने का केवल एक ही तरीका परिभाषित करता है, जो आपके एप्लिकेशन के शब्दार्थों को फिट नहीं कर सकता है: यदि आप किसी ऐसे url को POST या PUT करते हैं जो प्रोफ़ाइल फ़ोटो को अपडेट करता है, तो Location: [url of photo]
हेडर के साथ उत्तर दें और उस url के लिए कैश प्रविष्टि को अमान्य कर दिया जाएगा।
(यह वह तंत्र है जो आपको टिप्पणियों के साथ एक वेबपृष्ठ को कैश करने की अनुमति देता है, और फिर उपयोगकर्ता द्वारा नई टिप्पणी पोस्ट करने के बाद पृष्ठ को जबरन ब्राउज़र द्वारा पुनः लोड किया जाता है। ब्राउज़र एक और एक के POST /comment
साथ जवाब देगा । ध्यान दें कि यह उपयोग नहीं किया गया था। लंबे समय तक बग के कारण फ़ायरफ़ॉक्स में काम करना ।)303 See Other
Location: /page/with/comment
जब तक आपके पास बहुत अधिक ट्रैफ़िक नहीं है, कैशिंग के लिए यह दृष्टिकोण ठीक है।
उरोज बदलना
एक यूआरएल एक संसाधन का एक प्रतिनिधित्व है, इसलिए कैशिंग का प्रबंधन करने का एक और तरीका संसाधन के लिए कैश मापदंडों को बदलना नहीं है, बल्कि "कैश हमेशा के लिए" निर्देश के साथ एक नया संसाधन बनाना है। यह दृष्टिकोण है कि "बड़े लड़के" एहसान करते हैं, क्योंकि इससे उन्हें कोई अतिरिक्त अनुरोध उत्पन्न करने की अनुमति मिलती है , जिससे उन्हें बहुत सारे बैंडविड्थ की बचत होती है। नकारात्मक पक्ष यह है कि बहुत अधिक अतिरिक्त बहीखाता की आवश्यकता है।
इसके लिए दो सामान्य तकनीकें हैं।
क्वेरी स्ट्रिंग्स
फ़ाइल सिस्टम से फ़ाइल की सेवा करते समय वेब सर्वर क्वेरी स्ट्रिंग्स को अनदेखा करते हैं। कैश, हालांकि, नहीं: /1.jpg?t=12345
और /1.jpg?t=67890
दो पूरी तरह से अलग, असंबंधित संसाधन हैं, भले ही सर्वर को लगता है कि वे समान हैं।
जब भी आप अपने HTML में एक संसाधन के लिए एक संदर्भ बनाते हैं, और एक लंबे Expires
हेडर को सेट करते हैं, तो एक आसान चीज जो आप कर सकते हैं, वह है फाइल सिस्टम टाइमस्टैम्प को एक क्वेरी स्ट्रिंग के रूप में जोड़ना । तब ब्राउज़र इस संसाधन को हमेशा के लिए कैश कर देगा और जब तक क्वेरी स्ट्रिंग नहीं बदलेगा, तब तक कोई GET नहीं करेगा।
एक नकारात्मक पक्ष यह है कि किसी आइटम के लिए नए यूआरएल के वेबसर्वर को निर्देश देना मुश्किल या असंभव है यदि आप किसी कैश को जबरन अमान्य करना चाहते हैं। उदाहरण के लिए, यदि किसी ब्राउज़र में /1.jpg?v=1
संदर्भ के साथ एक कैश्ड एचटीएमएल पेज है , लेकिन प्रविष्टि को साफ़ करने के लिए हुआ है /1.jpg?v=1
(शायद यह फ़ाइल या मेमोरी स्पेस से बाहर चला गया है), तो यह एक नया अनुरोध करेगा /1.jpg?v=1
। यदि इस बीच छवि बदल गई है /1.jpg?v=2
, तो उचित प्रतिक्रिया या तो है:
- फ़ाइल का पुराना संस्करण परोसें। आप ऐसा करेंगे यदि आप चाहते थे कि सभी संसाधन एक-दूसरे के अनुरूप हों क्योंकि वे एक निश्चित समय पर थे। यह आपको सीएसएस फाइलों के साथ करना चाहिए, उदाहरण के लिए, चूंकि एक पुरानी एचटीएमएल फाइल वाली नई सीएसएस फाइल ठीक से काम नहीं कर सकती है!
- फ़ाइल के नए संस्करण का उपयोग करने के लिए पुनर्निर्देशित करें
301 Moved Permanently
। आप ऐसा करेंगे यदि आप चाहते थे कि सभी संसाधन यथासंभव नए हों।
इन दोनों को अकेले एक वेबसर्वर के साथ करना मुश्किल है, जिसका अर्थ है कि आपको छवि अनुरोधों के लिए भी एक वेब एप्लिकेशन को आमंत्रित करना होगा, जो अधिक जटिल और अधिक संसाधन-गहन दोनों हो सकता है। Webservers फ़ाइलों की सेवा में बहुत तेज़ हैं , इसलिए एक वेब एप्लिकेशन का ओवरहेड आपके बैंडविड्थ और विलंबता लाभ को निगल सकता है।
फ़ाइल नाम
क्वेरी स्ट्रिंग जोड़ने के बजाय, आप फ़ाइल नाम बदलते हैं। इसका मतलब है कि फ़ाइल सिस्टम पर फ़ाइलों के कई संस्करणों को रखना आसान है, लेकिन आपको संभवतः फ़ाइल मेटाडेटा को संग्रहीत करने और अपने संसाधनों और उनके नामों पर नज़र रखने के लिए अन्य डेटाबेस बुक-कीपिंग की आवश्यकता होगी।