2015-07-24 6 views
11

का उपयोग कर Redis से सेट मूल्य जाओ मैं Redis से मूल्यों को पुनः प्राप्त करने में सक्षम हूँ:<code>Jedis</code> का उपयोग कर RedisTemplate

public static void main(String[] args) { 
     Jedis jedis = new Jedis(HOST, PORT); 
     jedis.connect(); 
     Set<String> set = jedis.smembers(KEY); 
     for (String s : set) { 
      System.out.println(s); 
     } 
     jedis.disconnect(); 
     jedis.close(); 
    } 

लेकिन जब मैं वसंत के RedisTemplate उपयोग करने के लिए कोशिश कर रहा हूँ, मैं किसी भी डेटा नहीं मिल रहा है। मेरा डेटा Redis में Set के रूप में संग्रहीत किया गया है।

 // inject the actual template 
     @Autowired 
     private RedisTemplate<String, Object> template; 

     // inject the template as SetOperations 
     @Resource(name="redisTemplate") 
     private SetOperations<String,String> setOps; 

public String logHome() {  
     Set<String> set = setOps.members(KEY); 
     for(String str:set){ 
      System.out.println(str); //EMPTY 
     }  
     Set<byte[]> keys = template.getConnectionFactory().getConnection().keys("*".getBytes()); 
     Iterator<byte[]> it = keys.iterator(); 
     while(it.hasNext()){ 
      byte[] data = (byte[])it.next(); 
      System.out.println(new String(data, 0, data.length)); //KEYS are printed. 
     } 
     Set<Object> mySet = template.boundSetOps(KEY).members();   
     System.out.println(mySet); //EMPTY  
     return ""; 
    } 

क्या कोई मुझे बता सकता है कि मुझे क्या याद आ रहा है?

संपादित करें: RedisTemplate के लिए मेरा xml कॉन्फ़िगरेशन।

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" 
    p:connection-factory-ref="jedisConnectionFactory"/> 

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
     p:host-name="myhostname" p:port="6379" /> 
+0

क्या आप RedisTemplate की अपनी एक्सएमएल कॉन्फ़िगरेशन/@ कॉन्फ़िगरेशन पोस्ट कर सकते हैं? – mp911de

+0

@ mp911de जोड़ा गया। – Zeeshan

+0

धन्यवाद, मेरी धारणा की पुष्टि करता है। – mp911de

उत्तर

20

कम

में आप serializers कॉन्फ़िगर करने के लिए की है।

स्पष्टीकरण

Redis टेम्पलेट चाबियाँ, मूल्यों और हैश कुंजियों/मूल्यों के लिए serializers उपयोग करता है। Serializers का उपयोग जावा इनपुट को रेडिस के भीतर संग्रहीत प्रतिनिधित्व में बदलने के लिए किया जाता है। यदि आप कुछ भी कॉन्फ़िगर नहीं करते हैं, तो serializer JdkSerializationRedisSerializer पर डिफ़ॉल्ट है। इसलिए यदि आप अपने जावा कोड में एक महत्वपूर्ण key के लिए पूछना, serializer

"\xac\xed\x00\x05t\x00\x03key" 

में बदल देता है और स्प्रिंग डाटा Redis कुंजी Redis क्वेरी करने के लिए के रूप में उन बाइट्स का उपयोग करता है।

आप के साथ स्प्रिंग डाटा Redis डेटा जोड़ने और redis-cli का उपयोग कर इसे क्वेरी कर सकते हैं:

template.boundSetOps("myKey").add(new Date()); 

और फिर redis-cli

127.0.0.1:6379> keys * 
1) "\xac\xed\x00\x05t\x00\x05myKey" 
127.0.0.1:6379> SMEMBERS "\xac\xed\x00\x05t\x00\x05myKey" 
1) "\xac\xed\x00\x05sr\x00\x0ejava.util.Datehj\x81\x01KYt\x19\x03\x00\x00xpw\b\x00\x00\x01N\xcf#\x9cHx" 

जैसा कि आप देख, स्ट्रिंग और दिनांक में क्रमानुसार लगे हुए हैं में कुछ पागल बाइट्स जो जावा-सीरियलाइज्ड ऑब्जेक्ट का प्रतिनिधित्व करते हैं।

आपका कोड सुझाव देता है कि आप स्ट्रिंग-आधारित कुंजी और मानों को स्टोर करना चाहते हैं।

value 
key 
[value] 
: बस अपने कोड चलाने के बाद

redisTemplate.setKeySerializer(new StringRedisSerializer()); 
redisTemplate.setValueSerializer(new StringRedisSerializer()); 

एक्सएमएल विन्यास

<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/> 

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" 
    p:connection-factory-ref="jedisConnectionFactory"> 
    <property name="keySerializer" ref="stringSerializer"/> 
    <property name="valueSerializer" ref="stringSerializer"/> 
</bean> 

<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
    p:host-name="myhostname" p:port="6379"/> 

उत्पादन अपने RedisTemplate

जावा विन्यास में StringRedisSerializer सेट तो की तरह दिखता है

स्प्रिंग डेटा रेडिस में कुछ रोचक धारावाहिक हैं जो विभिन्न प्रणालियों के बीच संदेश विनिमय की अनुमति देते हैं।आप या तो निर्मित serializers

  • JacksonJsonRedisSerializer
  • Jackson2JsonRedisSerializer
  • JdkSerializationRedisSerializer (डिफ़ॉल्ट)
  • OxmSerializer
  • GenericToStringSerializer

या अपना खुद का बना से।

मैंने आपके प्रश्न के परिणाम को सत्यापित करने के लिए स्प्रिंग डेटा रेडिस 1.5.1.RELEASE और jedis 2.6.2 का उपयोग किया। HTH, मार्क

आगे पढ़ें:

+0

मुझे निम्न त्रुटि मिल रही है: ServletContext संसाधन [/WEB-INF/root-context.xml] में परिभाषित नाम 'श्रोता' के साथ बीन बनाने में त्रुटि: init विधि का आमंत्रण विफल हुआ; नेस्टेड अपवाद java.lang.IleglegalArgumentException: RedisConnectionFactory आवश्यक है – Zeeshan

+0

जावा कॉन्फ़िगरेशन के साथ ठीक काम करना। मुझे नहीं पता कि मुझे एक्सएमएल conf के लिए त्रुटि क्यों मिल रही है। धन्यवाद – Zeeshan

+1

मेरे पास कनेक्शन था एक्सएमएल उदाहरण से कारखाना हटा दिया गया। मैंने कोड अपडेट किया, अब यह काम कर रहा है। संकेत के लिए धन्यवाद। – mp911de

0

आप यह बहुत Redisson के साथ आसान कर सकता है:

public static void main(String[] args) { 
    Config conf = new Config(); 
    conf.useSingleServer().setAddress(host + ":" + port); 

    RedissonClient redisson = Redisson.create(conf); 
    RSet<String> set = redisson.getSet(KEY) 
    for (String s : set.readAllValues()) { 
     System.out.println(s); 
    } 
    redisson.shutdown(); 
} 

यह framewrok क्रमबद्धता संभालती है और के साथ काम कनेक्शन तो आपको जरूरत नहीं है हर बार इसके साथ सौदा करने के लिए। रेडिस के साथ काम करें क्योंकि आप जावा ऑब्जेक्ट्स (सेट, मैप, लिस्ट ...) के साथ काम करते थे। यह कई लोकप्रिय कोडेक्स का भी समर्थन करता है।

संबंधित मुद्दे