首页 新闻 会员 周边 捐助

spring整合redis key的序列化问题

0
悬赏园豆:50 [已解决问题] 解决于 2017-02-25 18:01

\xAC\xED\x00\x05t\x00保存的key都带这串东西。根据博文http://blog.csdn.net/yunhaibin/article/details/9001198 配置了也不行,各位能指点一下吗

<!-- spring.xml-->

<cache:annotation-driven cache-manager="cacheManager"/>
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean class="com.security.cache.SimpleCache">
<property name="redisTemplate" ref="redisTemplate" />
<property name="name" value="commonService.selectAll" />
<property name="timeout" value="${redis.timeout}" />
</bean>
</set>
</property>
</bean>

 

<!-- redis.xml-->

<bean id="propertyConfigur" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:redis.properties</value>
<value>classpath:shiro_db.properties</value>
</list>
</property>
</bean>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"
p:maxTotal="${redis.maxActive}"
p:testOnBorrow="${redis.testOnBorrow}"
p:MaxWaitMillis="${redis.maxWait}"
p:maxIdle="${redis.maxIdle}"/>

<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}" p:port="${redis.port}" p:pool-config-ref="poolConfig" />

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

长大的小伙的主页 长大的小伙 | 初学一级 | 园豆:171
提问于:2017-01-10 11:04
< >
分享
最佳答案
0

看了你的问题,我看了下测试的redis,确实有\xAC\xED\x00\x05t\x00这种类型的key值,但是我新走的key值是干净的。

你能把 你redis的save()方法贴出来吗,我redis的配置好像没有博文里哪些配置的。

收获园豆:50
让我发会呆 | 老鸟四级 |园豆:2929 | 2017-01-10 11:28

spring cache代码

@Override

@Cacheable(value = "commonService.selectAll",key="#key")

public List<UserModel> selectAll(String key,String sql) {
List<UserModel> list = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(UserModel.class));
System.out.println("selectAll: ==>" + list);
return list;
}

长大的小伙 | 园豆:171 (初学一级) | 2017-01-10 11:42

@长大的小伙: 你确定这是redis的save方法,至少得有redisTemplate调用的代码吧

让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-10 11:51

@让我发会呆: 还真是save方法,用了自己的序列化方法导致的。再请问下,我要存list值,应该咋办,redis没序列化list,public void put(Object key, final Object value) value是list类型,直接toString,去取缓存的时候,会类转换异常

长大的小伙 | 园豆:171 (初学一级) | 2017-01-10 12:23

@长大的小伙: 直接把list放进去呗, 你的toString()是啥意思?

让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-10 13:06

@让我发会呆: 不行啊。

public void put(Object key, final Object value) {
if (key == null || value == null) {
return;
} else {
final String finalKey = key.toString();
if (!StringUtils.isEmpty(finalKey)) {
redisTemplate.execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) {
byte[] key = redisTemplate.getStringSerializer().serialize(finalKey);
byte[] val = redisTemplate.getStringSerializer().serialize(value.toString());
connection.set(key, val);
// 设置超时间
connection.expire(key, timeout);
return true;
}
});
}
}
}

set方法只接受byte[]类型

长大的小伙 | 园豆:171 (初学一级) | 2017-01-10 13:32

@长大的小伙: 你传的是list,就别用它那个StringSerializer()了呗,

我的是:RedisSerializer<Serializable> valueSerializer = (RedisSerializer<Serializable>) redisTemplate.getValueSerializer();  list也实现了java.io.Serializable接口的。

你可以试试这个,把代码贴给你

@Override
public void save(final String key, final Serializable object, final long expireTime) {
// TODO Auto-generated method stub
try {
redisTemplate.execute(new RedisCallback<Serializable>() {
@Override
public Serializable doInRedis(RedisConnection connection) throws DataAccessException {
try {
@SuppressWarnings("unchecked")
RedisSerializer<Serializable> valueSerializer = (RedisSerializer<Serializable>) redisTemplate.getValueSerializer();
connection.set(redisTemplate.getStringSerializer().serialize(key), valueSerializer.serialize(object));
connection.expire(redisTemplate.getStringSerializer().serialize(key), expireTime);
} catch (Exception e) {
throw e;
}
return null;
}
});
} catch (Exception e) {
throw e;
}
}

让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-10 13:39

@让我发会呆: RedisSerializer<Serializable> valueSerializer = (RedisSerializer<Serializable>) redisTemplate.getValueSerializer(); 这是自己自定义一个序列化吗?

byte[] key = redisTemplate.getStringSerializer().serialize(finalKey);
RedisSerializer<List> rs = (RedisSerializer<List>) redisTemplate.getValueSerializer();
connection.set(key, rs.serialize((List)value));
// 设置超时间
connection.expire(key, timeout);
return true;

换成这样还是不可以,我自己定义了一个getValueSerializer

长大的小伙 | 园豆:171 (初学一级) | 2017-01-10 15:51

@长大的小伙: 不是啊,你看redisTemplate的源码啊,private RedisSerializer valueSerializer = null;

这个方法getValueSerializer()是它原本就有的。

让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-10 17:24

@长大的小伙: 哦,不好意思,刚看了下代码,我并没有尝试过直接放list进去,而是定义一个DTO把list当做一个变量set进这个dto,再把这个dto存入redis中的。

dto定义是这样的:

public class InvoiceFilter implements Serializable {

private static final long serialVersionUID = -4482211253965093821L;

private List<T> passInvoiceList;

 // get set 方法就不写了

}

让我发会呆 | 园豆:2929 (老鸟四级) | 2017-01-10 17:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册