2015-07-24 5 views
11

Я могу получить значения из Redis с помощью Jedis:Получить значение Set от Redis с помощью 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(); 
    } 

Но когда я пытаюсь использовать в Spring 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 ""; 
    } 

Может ли кто-нибудь указать мне, что мне не хватает?

EDIT: Моя конфигурация xml для RedisTemplate.

<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

Можете ли вы опубликовать конфигурацию XML/@ Конфигурация RedisTemplate? – mp911de

+0

@ mp911de добавлен. – Zeeshan

+0

Спасибо, подтверждает мое предположение. – mp911de

ответ

20

Короче

Вы должны настроить сериализаторы.

Объяснение

Шаблон Redis использует сериализаторы для ключей, значений и хэш-ключей/значений. Сериализаторы используются для преобразования входа Java в представление, которое хранится в Redis. Если вы ничего не сконфигурировали, по умолчанию для последовательного порта используется значение JdkSerializationRedisSerializer. Так что если вы попросите ключ key в коде Java, сериализатор преобразует его в

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

и Spring Data Redis использует эти байты в качестве ключа для запроса Redis.

Вы можете добавить данные с Spring Data 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" 

Как вы видите, строка и дата сериализуются в некоторые сумасшедшие байты, которые представляют собой Java-сериализованный объект.

В вашем коде предлагается хранить клавиши и значения на основе String. Просто установите StringRedisSerializer в вашем RedisTemplate

конфигурации Java

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

конфигурация XML

<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"/> 

Выходного сигнала после того, как работает ваш код выглядит как то:

value 
key 
[value] 

Spring Data В Redis есть несколько интересных сериализаторов, которые позволяют обмен сообщениями между различными системами.Вы можете выбрать любой из встроенных сериализаторов

  • JacksonJsonRedisSerializer
  • Jackson2JsonRedisSerializer
  • JdkSerializationRedisSerializer (по умолчанию)
  • OxmSerializer
  • GenericToStringSerializer

или создать свой собственный.

Я использовал Spring Data Redis 1.5.1.RELEASE и jedis 2.6.2 для проверки результата вашего вопроса. НТН, Марк

Далее читаем:

+0

Я получаю следующую ошибку: Ошибка создания bean-компонента с именем «listener», определенным в ресурсе ServletContext [/WEB-INF/root-context.xml]: вызов метода init не удался; Вложенное исключение - java.lang.IllegalArgumentException: требуется RedisConnectionFactory – Zeeshan

+0

Работа с настройкой java. Не знаю, почему я получаю сообщение об ошибке для xml conf. Спасибо – Zeeshan

+1

У меня был connectionFactory удален из XML-примера. Я обновил код, теперь он работает. Спасибо за подсказку. – 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 обрабатывает сериализации и работать с соединение, поэтому вам не нужно заниматься этим каждый раз. Работайте с Redis, когда вы использовали для работы с объектами Java (Set, Map, List ...). Он поддерживает многие популярные кодеки.

Смежные вопросы