项目中,redis作为一个单独的公共Moudle,被其他模块依赖
pom依赖:
<!--redis集成-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
代码:
@Autowired
private RedisTemplate redisTemplate;
/**
* 初始化基础数据
* @return
*/
@Override
public R<String> initBasicData() {
redisTemplate.opsForValue().set("HD-BASIC-USER","测试");
Map test = new HashMap<>();
test.put("hello","world");
redisTemplate.opsForHash().put("HD-BASIC-MAP","TEST", JSONUtil.toJsonStr(test));
return R.success("初始化成功");
}
/**
* 获取基础数据
* @return
*/
@Override
public R getBasicData() {
String user = (String) redisTemplate.opsForValue().get("HD-BASIC-USER");
log.info("-------------------------"+user);
return R.data(redisTemplate.opsForHash().get("HD-BASIC-MAP","TEST"));
}
初始化时存储数据到redis,检查redis时出现以下问题:
存储的String类型和HASH类型的数据,key前面出现了莫名其妙的编码,value也乱码了
百度了一波,是序列化的问题,RedisTemplate的keySerializer和valueSerializer默认使用的是JdkSerializationRedisSerializer,debug看一下:
果然,那就换一个序列化的方式,将String类型的key和value以及HASH类型的key都用StringRedisSerializer来序列化,避免出现乱码的问题,将HASH类型的value序列化方式设置为jackson2JsonRedisSerializer来进行序列化。
上代码:
1.公共的redis模块新建配置对象,并初始序列化方式:
HdRedisConfig
package com.hd.redis.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.Resource;
/**
* @author liuch
* @title: MyRedisConfig
* @description: redis自定义序列化
* @date 2021/8/6 9:51
*/
@Configuration
public class HdRedisConfig {
@Resource
RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisTemplate<Object, Object> redisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
2.更新依赖后再测试,发现没有生效,是因为redis模块作为公共能提供依赖,自己项目在执行时,没有扫描到公共模块的自定义配置,
解决方法:
启动l类添加注解:
@ComponentScan(basePackages ="com.hd")
再次测试:
搞定!