लेख का अनुवाद विशेष रूप से पाठ्यक्रम "स्प्रिंग फ्रेमवर्क पर डेवलपर" के छात्रों के लिए तैयार किया गया था ।
इस लेख में, हम स्प्रिंग डेटा रेडिस लाइब्रेरी का उपयोग करके स्प्रिंग बूट के माध्यम से रेडिस का उपयोग करने की मूल बातें कवर करेंगे।

हम एक एप्लिकेशन बनाएंगे जो दर्शाता है कि वेब इंटरफ़ेस के माध्यम से सीआरयूडी ऑपरेशन कैसे करें। इस प्रोजेक्ट
का सोर्स कोड
GitHub पर उपलब्ध है ।
रेडिस क्या है?
Redis
कुंजी-मूल्य डेटा संरचनाओं के लिए एक खुला स्रोत डेटा वेयरहाउस है जिसे डेटाबेस, कैश और संदेश ब्रोकर के रूप में उपयोग किया जा सकता है। कार्यान्वयन के संदर्भ में, की-वैल्यू स्टोर NoSQL दुनिया के सबसे बड़े और सबसे पुराने प्रतिनिधियों में से हैं। रेडिस डेटा क्वेरीज़ जैसे स्ट्रिंग्स, हैश, लिस्ट्स, सेट्स, और रेंज क्वेरीज़ के साथ सॉर्ट किए गए सेट्स को सपोर्ट करता है।
स्प्रिंग डेटा रेडिस फ्रेमवर्क, स्प्रिंग एप्लिकेशन को लिखना आसान बनाता है जो रेडिस स्टोरेज का उपयोग करते हैं, डेटा स्टोरेज का एक सुविधाजनक अमूर्त प्रदान करते हैं।
रेडिस सर्वर सेटअप
सर्वर
यहां मुफ्त में उपलब्ध
है ।
यदि आप Mac का उपयोग कर रहे हैं, तो आप इसे
homebrew
का उपयोग करके स्थापित कर सकते हैं:
brew install redis
फिर सर्वर शुरू करें:
mikes-MacBook-Air:~ mike$ redis-server 10699:C 23 Nov 08:35:58.306 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 10699:C 23 Nov 08:35:58.307 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=10699, just started 10699:C 23 Nov 08:35:58.307 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 10699:M 23 Nov 08:35:58.309 * Increased maximum number of open files to 10032 (it was originally set to 256). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.2 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 10699 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 10699:M 23 Nov 08:35:58.312 # Server initialized 10699:M 23 Nov 08:35:58.312 * Ready to accept connections
मावेन निर्भरता
आइए हम जिस एप्लिकेशन के साथ काम करेंगे उसके लिए
pom.xml
में आवश्यक निर्भरता घोषित करें:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
रेडिस कॉन्फ़िगरेशन
हमें अपने एप्लिकेशन को रेडिस सर्वर से कनेक्ट करना होगा। कनेक्शन स्थापित करने के लिए, हम
जेडिस ,
रेडिस के एक ग्राहक कार्यान्वयन का उपयोग करते हैं।
विन्यास
चलो विन्यास बीन्स की परिभाषा के साथ शुरू करते हैं:
@Bean JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); } @Bean public RedisTemplate<String, Object> redisTemplate() { final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(jedisConnectionFactory()); template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class)); return template; }
JedisConnectionFactory
एक सेम के रूप में प्रस्तुत किया गया है, ताकि हम डेटा का अनुरोध करने के लिए एक
RedisTemplate
बना
RedisTemplate
।
पोस्ट प्रकाशक
SOLID के
सिद्धांतों के बाद, हम
MessagePublisher
इंटरफ़ेस बनाते हैं:
public interface MessagePublisher { void publish(final String message); }
हम संदेश को प्रकाशित करने के लिए उच्च-स्तरीय RedisTemplate का उपयोग करके
MessagePublisher
इंटरफ़ेस लागू करते हैं, क्योंकि
RedisTemplate
संदेशों के रूप में मनमाने ऑब्जेक्ट भेजने की अनुमति देता है:
@Service public class MessagePublisherImpl implements MessagePublisher { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private ChannelTopic topic; public MessagePublisherImpl() { } public MessagePublisherImpl(final RedisTemplate<String, Object> redisTemplate, final ChannelTopic topic) { this.redisTemplate = redisTemplate; this.topic = topic; } public void publish(final String message) { redisTemplate.convertAndSend(topic.getTopic(), message); } }
हम इसे
RedisConfig
में सेम के रूप में भी परिभाषित करते हैं:
@Bean MessagePublisher redisPublisher() { return new MessagePublisherImpl(redisTemplate(), topic()); }
संदेश प्राप्तकर्ता
संदेशों की सदस्यता के लिए, आपको
MessageListener
इंटरफ़ेस को लागू करने की आवश्यकता है: हर बार जब एक नया संदेश आता है, तो
onMessage
विधि में स्थित उपयोगकर्ता कोड
onMessage
। यह इंटरफ़ेस संदेश, उस चैनल तक पहुंच प्रदान करता है जिसके माध्यम से इसे प्राप्त किया गया था, और आपको चैनल की सदस्यता लेने के लिए उपयोग किए गए किसी भी टेम्पलेट का उपयोग करने की अनुमति देता है।
@Service public class MessageSubscriber implements MessageListener { public static List<String> messageList = new ArrayList<String>(); public void onMessage(final Message message, final byte[] pattern) { messageList.add(message.toString()); System.out.println("Message received: " + new String(message.getBody())); } }
इसके अलावा, यह वर्ग
RedisConfig
में सेम के रूप में पंजीकृत होना चाहिए:
@Bean MessageListenerAdapter messageListener() { return new MessageListenerAdapter(new MessageSubscriber()); }
RedisRepository
अब जब हमने Redis सर्वर के साथ बातचीत करने के लिए एप्लिकेशन सेट किया है, तो हम परीक्षण डेटा प्राप्त करने के लिए एप्लिकेशन तैयार करेंगे।
आदर्श
इस उदाहरण के लिए, हम दो क्षेत्रों के साथ एक
Movie
मॉडल परिभाषित करते हैं:
private String id; private String name;
रिपोजिटरी इंटरफ़ेस
अन्य स्प्रिंग डेटा परियोजनाओं के विपरीत, स्प्रिंग डेटा रेडिस आपको अन्य स्प्रिंग डेटा इंटरफेस के शीर्ष पर काम करने के लिए आवश्यक सब कुछ प्रदान करता है। यह अन्य स्प्रिंग डेटा परियोजनाओं के साथ अनुभव वाले लोगों के लिए अजीब लग सकता है।
अक्सर स्प्रिंग डेटा प्रोजेक्ट्स के साथ रिपॉजिटरी इंटरफ़ेस कार्यान्वयन लिखने की आवश्यकता नहीं होती है। हम इंटरफेस के साथ बातचीत करते हैं। स्प्रिंग डेटा जेपीए कई रिपॉजिटरी इंटरफेस प्रदान करता है जिसे सीआरयूडी संचालन, व्युत्पन्न क्वेरी और पेजिनेशन जैसी सुविधाएँ प्रदान करने के लिए बढ़ाया जा सकता है।
इसलिए, दुर्भाग्य से, हमें
अपना स्वयं का इंटरफ़ेस लिखना होगा, और फिर विधियों को परिभाषित करना होगा :
public interface RedisRepository { Map<Object, Object> findAllMovies(); void add(Movie movie); void delete(String id); Movie findMovie(String id); }
रिपोजिटरी कार्यान्वयन
वर्ग
RedisConfig
कॉन्फ़िगरेशन
RedisConfig
में परिभाषित
redisTemplate
का उपयोग करता है।
हम
HashOperations
उपयोग
HashOperations
, जो स्प्रिंग डेटा
HashOperations
प्रदान करता है:
@Repository public class RedisRepositoryImpl implements RedisRepository { private static final String KEY = "Movie"; private RedisTemplate<String, Object> redisTemplate; private HashOperations hashOperations; @Autowired public RedisRepositoryImpl(RedisTemplate<String, Object> redisTemplate){ this.redisTemplate = redisTemplate; } @PostConstruct private void init(){ hashOperations = redisTemplate.opsForHash(); } public void add(final Movie movie) { hashOperations.put(KEY, movie.getId(), movie.getName()); } public void delete(final String id) { hashOperations.delete(KEY, id); } public Movie findMovie(final String id){ return (Movie) hashOperations.get(KEY, id); } public Map<Object, Object> findAllMovies(){ return hashOperations.entries(KEY); } }
चलो
init()
विधि पर ध्यान दें। इस पद्धति में, हम
opsForHash()
नामक एक फ़ंक्शन का उपयोग करते हैं, यह इस कुंजी से
opsForHash()
हैश मानों
opsForHash()
साथ किए गए संचालन को लौटाता है। फिर हम
hashOps
उपयोग
hashOps
, जिसे हमारे सभी
hashOps
init()
में परिभाषित किया गया था।
वेब इंटरफ़ेस
इस खंड में, हम वेब इंटरफ़ेस में Redis CRUD क्षमताओं को जोड़कर देखेंगे।
कोई फिल्म जोड़ रहा है
हम एक वेब पेज के माध्यम से एक फिल्म जोड़ना चाहते हैं। कुंजी फिल्म की पहचानकर्ता है, और मूल्य वास्तविक वस्तु है। हालांकि, हम बाद में इस पर लौट आएंगे, इसलिए केवल फिल्म के नाम को मूल्य के रूप में प्रदर्शित किया जाता है।
आइए HTML दस्तावेज़ में एक फ़ॉर्म जोड़ें और उपयुक्त नाम और पहचानकर्ता निर्दिष्ट करें:
<form id="addForm"> <div class="form-group"> <label for="keyInput">Movie ID (key)</label> <input name="keyInput" id="keyInput" class="form-control"/> </div> <div class="form-group"> <label for="valueInput">Movie Name (field of Movie object value)</label> <input name="valueInput" id="valueInput" class="form-control"/> </div> <button class="btn btn-default" id="addButton">Add</button> </form>
फॉर्म सबमिट करते समय मूल्यों को बचाने के लिए अब हम जावास्क्रिप्ट का उपयोग करते हैं:
$(document).ready(function() { var keyInput = $('#keyInput'), valueInput = $('#valueInput'); refreshTable(); $('#addForm').on('submit', function(event) { var data = { key: keyInput.val(), value: valueInput.val() }; $.post('/add', data, function() { refreshTable(); keyInput.val(''); valueInput.val(''); keyInput.focus(); }); event.preventDefault(); }); keyInput.focus(); });
हम POST अनुरोध के लिए
@RequestMapping
पैरामीटर सेट करते हैं, कुंजी और मूल्य का अनुरोध करते हैं,
Movie
ऑब्जेक्ट बनाते हैं और इसे रिपॉजिटरी में सहेजते हैं:
@RequestMapping(value = "/add", method = RequestMethod.POST) public ResponseEntity<String> add( @RequestParam String key, @RequestParam String value) { Movie movie = new Movie(key, value); redisRepository.add(movie); return new ResponseEntity<>(HttpStatus.OK); }
सामग्री देखें
एक बार मूवी ऑब्जेक्ट जुड़ जाने के बाद, हम नए मूल्यों को प्रदर्शित करने के लिए तालिका को अपडेट करते हैं। जावास्क्रिप्ट कोड के ब्लॉक में, हमने
refreshTable()
फ़ंक्शन को कहा। यह रिपॉजिटरी में वर्तमान डेटा को पुनः प्राप्त करने के लिए एक GET अनुरोध करता है:
function refreshTable() { $.get('/values', function(data) { var attr, mainTable = $('#mainTable tbody'); mainTable.empty(); for (attr in data) { if (data.hasOwnProperty(attr)) { mainTable.append(row(attr, data[attr])); } } }); }
GET अनुरोध को
findAll()
विधि द्वारा संसाधित किया जाता है, जो स्टोर में संग्रहीत सभी मूवी ऑब्जेक्ट्स को पुनर्प्राप्त करता है और फिर डेटा प्रकार को
Map <Object, Object>
से
Map <String, String>
परिवर्तित करता है:
@RequestMapping("/values") public @ResponseBody Map<String, String> findAll() { Map<Object, Object> aa = redisRepository.findAllMovies(); Map<String, String> map = new HashMap<String, String>(); for(Map.Entry<Object, Object> entry : aa.entrySet()){ String key = (String) entry.getKey(); map.put(key, aa.get(key).toString()); } return map; }
फिल्म निकालना
हम
/delete
पथ के साथ एक POST अनुरोध करने के लिए एक स्क्रिप्ट लिखेंगे, टेबल को अपडेट करेंगे और सुविधाजनक इनपुट के लिए कीबोर्ड फ़ोकस को स्विच करेंगे:
function deleteKey(key) { $.post('/delete', {key: key}, function() { refreshTable(); $('#keyInput').focus(); }); }
हम एक कुंजी का अनुरोध करते हैं और इस कुंजी के आधार पर ऑब्जेक्ट को
redisRepository
में
redisRepository
:
@RequestMapping(value = "/delete", method = RequestMethod.POST) public ResponseEntity<String> delete(@RequestParam String key) { redisRepository.delete(key); return new ResponseEntity<>(HttpStatus.OK); }
डेमो
यहाँ हमने दो फ़िल्में जोड़ीं:

और एक फिल्म हटाई गई:

निष्कर्ष
इस गाइड में, हमने स्प्रिंग डेटा रेडिस को देखा और सीआरयूडी ऑपरेशन करने के लिए इसे वेब एप्लिकेशन से कनेक्ट करने का एक तरीका बताया।
नमूना अनुप्रयोग के लिए स्रोत कोड
GitHub पर
है ।
वह सब है। परंपरागत रूप से आपकी टिप्पणियों की प्रतीक्षा है।