环境:redis单机、SpringBoot项目
坑1:获取数据为null
现象描述:
redis里有数据,取的时候key没写错,语法没错,执行没有报错,但取出来就是null
解决:
项目的RedisConfig中,没有配置hashKeySerializer,导致key序列化失败,自然查不到,修复后代码放在最后了
坑2:报序列化异常
现象描述:
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Invalid type id ‘xxxx’ (for id type ‘Id.class’): no such class found
解决:
配置的HashValueSerializer不对,这个因项目而异,需要与存入redis时的序列化配置的保持一致,或者用StringRedisSerializer也可以。
解决代码
在RedisConfig类中增加:
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(stringRedisSerializer);
template.afterPropertiesSet();
return template;
如果是SpringMVC项目:
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory">
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"></property>
<property name="port" value="${redis.port}"></property>
<property name="password" value="${redis.pass}"></property>
<property name="poolConfig" ref="jedisPoolConfig"></property>
<property name="timeout" value="${redis.timeout}"></property>
<property name="database" value="8"></property>
</bean>
</property>
<property name="keySerializer" ref="stringRedisSerializer" />
<property name="hashKeySerializer" ref="stringRedisSerializer" />
<property name="hashValueSerializer" ref="stringRedisSerializer" />
<property name="valueSerializer" ref="stringRedisSerializer" />
</bean>
扩展
经过以上配置获取到的结果为Map结构的字符串,String转Map
Map<String, String> temp = JSON.parseObject(xxx, HashMap.class);