spring redisTemplate 持久化到redis中数据更改为String类型

来源:互联网 发布:js获取页面所有内容 编辑:程序博客网 时间:2024/06/06 07:37

原配置文件:

<bean id="jedisTemplate" class="com.mljr.yourcredit.installment.common.JedisWrapper"
scope="singleton">
<property name="redisServerHost" value="${redis.server.host}" />
<property name="redisServerPort" value="${redis.server.port}" />
<property name="redisServerPassword" value="${redis.server.pwd}" />
<property name="redisServerTimeout" value="${redis.server.timeout}" />
</bean>


<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="minIdle" value="${redis.minIdle}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>

<bean id="jedisConnFactory"

class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.server.host}" p:port="${redis.server.port}"
p:timeout="${redis.server.timeout}" p:password="${redis.server.pwd}"
p:pool-config-ref="poolConfig" p:use-pool="true" />


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


<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnFactory" p:keySerializer-ref="stringSerializer"
p:hashKeySerializer-ref="stringSerializer" 

/>

原因:
spring操作redis是在jedis客户端基础上进行的,而jedis客户端与redis交互的时候协议中定义是用byte类型交互,jedis中提供了string类型转为byte[]类型,
但是看到spring-data-redis中RedisTemplate<K, V>在操作的时候k,v是泛型的,所以RedisTemplate中有了上面那段代码,在没有特殊定义的情况下,

spring默认采用defaultSerializer = new JdkSerializationRedisSerializer();来对key,value进行序列化操作
解决的办法就是手动定义序列化的方法,spring-data-redis中还提供了一个序列化的类专门针对string类型的序列化org.springframework.data.redis.serializer.StringRedisSerializer这个类,可以在xml里面指定:


将配置文件更改为:

<bean id="jedisTemplate" class="com.mljr.yourcredit.installment.common.JedisWrapper"
scope="singleton">
<property name="redisServerHost" value="${redis.server.host}" />
<property name="redisServerPort" value="${redis.server.port}" />
<property name="redisServerPassword" value="${redis.server.pwd}" />
<property name="redisServerTimeout" value="${redis.server.timeout}" />
</bean>


<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="minIdle" value="${redis.minIdle}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>

<bean id="jedisConnFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.server.host}" p:port="${redis.server.port}"
p:timeout="${redis.server.timeout}" p:password="${redis.server.pwd}"
p:pool-config-ref="poolConfig" p:use-pool="true" />


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


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

    <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"
        p:connectionFactory-ref="jedisConnFactory" />

        
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"
c:redisOperations-ref="redisTemplate" />

标红处我们增加了属性和配置bean"stringRedisTemplate"  并且 redisTemplate 新增加了 p:hashKeySerializer-ref   和 p:hashValueSerializer-ref  并且都引用了 stringSerializer String类型的 redis持久化class 所以当我们再从 redis命令行中 输出信息的时候 看到的便是 string类型的数据了。当然 我们再次引用的时候 使用 stringRedisTemplate 即可。

例如:

  ValueOperations<String, String> opsForValue  = stringRedisTemplate.opsForValue();

  opsForValue.set("testKeyValue","1");
        System.out.println(opsForValue.get("testKeyValue")); //1 这里就变成string类型了  之前是 byte类型 也就是springRedisTemplate 默认的



原创粉丝点击