spring-boot
MongoDB के लिए स्प्रिंग बूट का उपयोग करते हुए रेडिस के साथ कैशिंग
खोज…
कैशिंग क्यों?
आज, प्रदर्शन सबसे महत्वपूर्ण मीट्रिक में से एक है जिसे हमें वेब सेवा / एप्लिकेशन विकसित करते समय मूल्यांकन करने की आवश्यकता है। ग्राहकों को व्यस्त रखना किसी भी उत्पाद के लिए महत्वपूर्ण है और इस कारण से, प्रदर्शन में सुधार करना और पृष्ठ लोड समय को कम करना बेहद महत्वपूर्ण है।
एक डेटाबेस के साथ इंटरेक्ट करने वाले वेब सर्वर को चलाते समय, इसका संचालन एक अड़चन बन सकता है। MongoDB यहाँ कोई अपवाद नहीं है, और जैसे ही हमारे MongoDB डेटाबेस को बढ़ाते हैं, चीजें वास्तव में धीमी हो सकती हैं। डेटाबेस सर्वर वेब सर्वर से अलग होने पर यह समस्या और भी बदतर हो सकती है। ऐसी प्रणालियों में, डेटाबेस के साथ संचार एक बड़े उपरि का कारण बन सकता है।
सौभाग्य से, हम चीजों को गति देने के लिए कैशिंग नामक विधि का उपयोग कर सकते हैं। इस उदाहरण में, हम इस पद्धति का परिचय देंगे और देखेंगे कि हम स्प्रिंग कैश, स्प्रिंग डेटा और रेडिस का उपयोग करके अपने एप्लिकेशन के प्रदर्शन को बढ़ाने के लिए इसका उपयोग कैसे कर सकते हैं।
बेसिक सिस्टम
पहले चरण के रूप में, हम एक मूल वेब सर्वर का निर्माण करेंगे जो MongoDB में डेटा संग्रहीत करता है। इस प्रदर्शन के लिए, हम इसे "फास्ट लाइब्रेरी" नाम देंगे। सर्वर में दो बुनियादी ऑपरेशन होंगे:
POST /book
: यह समापन बिंदु शीर्षक, लेखक और पुस्तक की सामग्री प्राप्त करेगा, और डेटाबेस में एक पुस्तक प्रविष्टि तैयार करेगा।
GET /book/ {title}
: इस समापन बिंदु को एक शीर्षक मिलेगा और इसकी सामग्री वापस होगी। हम मानते हैं कि शीर्षक विशिष्ट रूप से पुस्तकों की पहचान करते हैं (इस प्रकार, एक ही शीर्षक वाली दो पुस्तकें नहीं होंगी)। एक बेहतर विकल्प, ज़ाहिर है, एक आईडी का उपयोग करना होगा। हालाँकि, चीजों को सरल रखने के लिए, हम केवल शीर्षक का उपयोग करेंगे।
यह एक सरल पुस्तकालय प्रणाली है, लेकिन हम बाद में अधिक उन्नत क्षमताओं को जोड़ेंगे।
अब, चलो स्प्रिंग टूल सूट (ग्रहण का उपयोग करके निर्माण) और स्प्रिंग स्टार्टर प्रोजेक्ट का उपयोग करके प्रोजेक्ट बनाएं
हम जावा का उपयोग करके अपनी परियोजना का निर्माण कर रहे हैं और निर्माण के लिए हम मावेन का उपयोग कर रहे हैं, मूल्यों का चयन करें और अगले पर क्लिक करें
MongoDB, NOSQL से रेडिस और वेब मॉड्यूल से वेब का चयन करें और खत्म पर क्लिक करें। हम सेटर्स की ऑटो जनरेशन और मॉडल वैल्यू पाने वालों के लिए लोम्बोक का उपयोग कर रहे हैं, इसलिए हमें लोम्बोक डिपेंडेंसी को पोम में जोड़ना होगा।
MongoDbRedisCacheApplication.java में मुख्य विधि है जो स्प्रिंग बूट एप्लिकेशन ऐड को चलाने के लिए उपयोग की जाती है
मॉडल क्लास बुक बनाएँ जिसमें आईडी, पुस्तक का शीर्षक, लेखक, विवरण और @ डिटेल के साथ एनोटेट करें ताकि स्वचालित प्रोजेक्टर्स और जार प्रोजेक्ट लोमॉक से प्राप्त किया जा सके।
package com.example;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import lombok.Data;
@Data
public class Book {
@Id
private String id;
@Indexed
private String title;
private String author;
private String description;
}
स्प्रिंग डेटा स्वचालित रूप से हमारे लिए सभी मूल CRUD संचालन बनाता है तो चलिए BookRepository.Java बनाते हैं जो पुस्तक को शीर्षक से खोजता है और पुस्तक को हटाता है
package com.example;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface BookRepository extends MongoRepository<Book, String>
{
Book findByTitle(String title);
void delete(String title);
}
चलो webservicesController बनाते हैं जो MongoDB को डेटा बचाता है और idTitle (@PathVariable String शीर्षक) द्वारा डेटा पुनर्प्राप्त करता है।
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebServicesController {
@Autowired
BookRepository repository;
@Autowired
MongoTemplate mongoTemplate;
@RequestMapping(value = "/book", method = RequestMethod.POST)
public Book saveBook(Book book)
{
return repository.save(book);
}
@RequestMapping(value = "/book/{title}", method = RequestMethod.GET)
public Book findBookByTitle(@PathVariable String title)
{
Book insertedBook = repository.findByTitle(title);
return insertedBook;
}
}
कैश जोड़ना अब तक हमने एक बेसिक लाइब्रेरी वेब सेवा बनाई है, लेकिन यह आश्चर्यजनक रूप से तेज नहीं है। इस अनुभाग में, हम परिणामों को कैशिंग करके findBookByTitle () विधि को अनुकूलित करने का प्रयास करेंगे।
हम इस लक्ष्य को कैसे प्राप्त करेंगे, इसका बेहतर विचार पाने के लिए, आइए एक पारंपरिक पुस्तकालय में बैठे लोगों के उदाहरण पर वापस जाएं। मान लीजिए कि वे एक निश्चित शीर्षक के साथ पुस्तक ढूंढना चाहते हैं। सबसे पहले, वे यह देखने के लिए तालिका के चारों ओर देखेंगे कि क्या वे पहले से ही वहाँ लाए हैं। अगर उनके पास है, तो यह बहुत अच्छा है! उनके पास बस एक कैश हिट था जो कैश में एक आइटम ढूंढ रहा है। यदि वे इसे नहीं पाते हैं, तो उनके पास कैश मिस था, जिसका अर्थ है कि वे कैश में आइटम नहीं ढूंढते थे। एक लापता वस्तु के मामले में, उन्हें पुस्तकालय में पुस्तक की तलाश करनी होगी। जब वे इसे पा लेंगे, तो वे इसे अपनी मेज पर रखेंगे या कैश में डालेंगे।
हमारे उदाहरण में, हम findBookByTitle () विधि के लिए समान एल्गोरिथ्म का पालन करेंगे। एक निश्चित शीर्षक वाली पुस्तक के लिए पूछे जाने पर, हम इसे कैश में देखेंगे। यदि नहीं मिला है, तो हम इसे मुख्य भंडारण में देखेंगे, यह हमारा MongoDB डेटाबेस है।
रेडिस का उपयोग करना
वसंत-बूट-डेटा-लालियों को हमारे वर्ग पथ में जोड़ने से वसंत बूट अपने जादू का प्रदर्शन करने की अनुमति देगा। यह ऑटो कॉन्फ़िगरेशन द्वारा सभी आवश्यक संचालन बनाएगा
चलिए अब कैश करने के लिए नीचे लाइन के साथ विधि को एनोटेट करें और स्प्रिंग बूट को अपना जादू करने दें
@Cacheable (value = "book", key = "#title")
कैश को हटाने के लिए जब कोई रिकॉर्ड हटा दिया जाता है, तो BookRepository में नीचे की लाइन के साथ एनोटेट करें और स्प्रिंग बूट को कैश डिलीट करने दें।
@CacheEvict (value = "book", key = "#title")
डेटा को अपडेट करने के लिए हमें विधि के नीचे लाइन जोड़ने की जरूरत है और स्प्रिंग बूट को संभालने दें
@CachePut(value = "book", key = "#title")
आप GitHub पर पूर्ण परियोजना कोड पा सकते हैं