Kurz gesagt
Sie müssen Serialisierer konfigurieren.
Erklärung
Die Redis-Vorlage verwendet Serialisierer für Schlüssel, Werte und Hash-Schlüssel/Werte. Serialisierer werden verwendet, um die Java-Eingabe in die Darstellung zu konvertieren, die in Redis gespeichert ist. Wenn Sie nichts konfigurieren, verwendet der Serializer standardmäßig JdkSerializationRedisSerializer
. Wenn Sie also nach einem Schlüssel fragen key
in Ihrem Java-Code konvertiert der Serializer ihn in
"\xac\xed\x00\x05t\x00\x03key"
und Spring Data Redis verwendet diese Bytes als Schlüssel zum Abfragen von Redis.
Sie können Daten mit Spring Data Redis hinzufügen und mit redis-cli
abfragen :
template.boundSetOps("myKey").add(new Date());
und dann im 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"
Wie Sie sehen, werden der String und das Datum in einige verrückte Bytes serialisiert, die ein Java-serialisiertes Objekt darstellen.
Ihr Code schlägt vor, dass Sie Zeichenfolgen-basierte Schlüssel und Werte speichern möchten. Setzen Sie einfach den StringRedisSerializer
in Ihrem RedisTemplate
Java-Konfiguration
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
XML-Konfiguration
<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"/>
Die Ausgabe nach dem Ausführen Ihres Codes sieht dann so aus:
value
key
[value]
Spring Data Redis hat einige interessante Serialisierer, die den Nachrichtenaustausch zwischen verschiedenen Systemen ermöglichen. Sie können einen der integrierten Serialisierer auswählen
- JacksonJsonRedisSerializer
- Jackson2JsonRedisSerializer
- JdkSerializationRedisSerializer (Standard)
- OxmSerializer
- GenericToStringSerializer
oder erstellen Sie Ihre eigenen.
Ich habe Spring Data Redis 1.5.1.RELEASE und Jedis 2.6.2 verwendet, um das Ergebnis Ihrer Frage zu überprüfen. HTH, Markus
Weiterlesen:
- Spring Data Redis:Serialisierer
- Gist mit Ihrem Beispiel