En bref
Vous devez configurer les sérialiseurs.
Explication
Le modèle Redis utilise des sérialiseurs pour les clés, les valeurs et les clés/valeurs de hachage. Les sérialiseurs sont utilisés pour convertir l'entrée Java en la représentation stockée dans Redis. Si vous ne configurez rien, le sérialiseur par défaut est JdkSerializationRedisSerializer
. Donc si vous demandez une clé key
dans votre code Java, le sérialiseur le convertit en
"\xac\xed\x00\x05t\x00\x03key"
et Spring Data Redis utilise ces octets comme clé pour interroger Redis.
Vous pouvez ajouter des données avec Spring Data Redis et les interroger à l'aide de redis-cli
:
template.boundSetOps("myKey").add(new Date());
puis dans le 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"
Comme vous le voyez, la chaîne et la date sont sérialisées en quelques octets fous qui représentent un objet sérialisé Java.
Votre code suggère que vous souhaitiez stocker des clés et des valeurs basées sur une chaîne. Définissez simplement le StringRedisSerializer
dans votre RedisTemplate
Configuration Java
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
Configuration 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"/>
La sortie après l'exécution de votre code ressemble alors :
value
key
[value]
Spring Data Redis possède des sérialiseurs intéressants qui permettent l'échange de messages entre différents systèmes. Vous pouvez choisir parmi les sérialiseurs intégrés
- JacksonJsonRedisSerializer
- Jackson2JsonRedisSerializer
- JdkSerializationRedisSerializer (par défaut)
- OxmSerializer
- GenericToStringSerializer
ou créez le vôtre.
J'ai utilisé Spring Data Redis 1.5.1.RELEASE et jedis 2.6.2 pour vérifier le résultat de votre question. HTH, Marc
Lire plus :
- Spring Data Redis :sérialiseurs
- Gist contenant votre exemple