Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Por que os dados são armazenados com chaves estranhas no Redis ao usar Jedis com Spring Data?


Ok, pesquisei por um tempo e encontrei ajuda em http://java.dzone.com/articles/spring-data-redis.

Isso aconteceu por causa da serialização Java.

O serializador de chave para redisTemplate precisa ser configurado para StringRedisSerializer ou seja, assim:
<bean 
    id="jedisConnectionFactory" 
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
    p:host-name="${redis.server}" 
    p:port="${redis.port}" 
    p:use-pool="true"/>

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

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

Agora a chave no redis é vc:501381 .

Ou, como @niconic diz, também podemos definir o serializador padrão para o serializador de string da seguinte maneira:
<bean 
    id="redisTemplate" 
    class="org.springframework.data.redis.core.RedisTemplate"
    p:connection-factory-ref="jedisConnectionFactory" 
    p:defaultSerializer-ref="stringRedisSerializer"
/>

o que significa que todas as nossas chaves e valores são strings. Observe, no entanto, que isso pode não ser preferível, pois você pode querer que seus valores não sejam apenas strings.

Se o seu valor for um objeto de domínio, você poderá usar o serializador Jackson e configurar um serializador conforme mencionado aqui, ou seja, assim:
<bean id="userJsonRedisSerializer" class="org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer">
    <constructor-arg type="java.lang.Class" value="com.mycompany.redis.domain.User"/>
</bean>

e configure seu modelo como:
<bean 
    id="redisTemplate" 
    class="org.springframework.data.redis.core.RedisTemplate"
    p:connection-factory-ref="jedisConnectionFactory" 
    p:keySerializer-ref="stringRedisSerializer"
    p:hashKeySerializer-ref="stringRedisSerializer" 
    p:valueSerialier-ref="userJsonRedisSerializer"
/>