\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>
看了你的问题,我看了下测试的redis,确实有\xAC\xED\x00\x05t\x00这种类型的key值,但是我新走的key值是干净的。
你能把 你redis的save()方法贴出来吗,我redis的配置好像没有博文里哪些配置的。
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;
}
@长大的小伙: 你确定这是redis的save方法,至少得有redisTemplate调用的代码吧
@让我发会呆: 还真是save方法,用了自己的序列化方法导致的。再请问下,我要存list值,应该咋办,redis没序列化list,public void put(Object key, final Object value) value是list类型,直接toString,去取缓存的时候,会类转换异常
@长大的小伙: 直接把list放进去呗, 你的toString()是啥意思?
@让我发会呆: 不行啊。
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[]类型
@长大的小伙: 你传的是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;
}
}
@让我发会呆: 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
@长大的小伙: 不是啊,你看redisTemplate的源码啊,private RedisSerializer valueSerializer = null;
这个方法getValueSerializer()是它原本就有的。
@长大的小伙: 哦,不好意思,刚看了下代码,我并没有尝试过直接放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 方法就不写了
}