安装与配置
大约 2 分钟
Maven 依赖
<dependency>
<groupId>com.simperfect.commons</groupId>
<artifactId>simperfect-dynamic-redis</artifactId>
</dependency>
存储前缀配置
每个模块的 redis 存储前缀都是固定的,需要配置在 application.yml 中。
simperfect:
redis:
redis-prefix: 'default:'
默认已注入Bean
Bean 名称 | Key 序列化 | value 序列化 | hash key 序列化 | hash value 序列化 |
---|---|---|---|---|
redisTemplate | string | jdk | string | jdk |
longRedisTemplate | string | long | string | long |
longValueOperations | string | long | string | long |
redisTemplate
只是覆盖了 spring 默认的序列化方式,将 key 序列化改为 string,防止 key 出现无意义的字符。为了方便跟踪问题,您也可以使用 Jackson2JsonRedisSerializer
序列化方式创建自己的 bean,这样我们可以更加丝滑的使用泛型。我以技能缓存为例:
为什么不将其配置默认序列化为 Jackson2,而是推荐自定义?
因为如果想要配置通用就要将序列化配置为 Object
,伴随的问题就是序列化后会带有类型,如果自定义泛型后就不会有此问题。例如:
[
"com.simperfect.entity.BpSkill",
{
"skillCode": "skillCode"
}
]
@Component
@Configuration
public class SkillCacheRedisConfiguration {
@Resource
private RedisConnectionFactory redisConnectionFactory;
/**
* 技能数据缓存,使用技能码查询技能信息
*
* @return org.springframework.data.redis.core.RedisTemplate<java.lang.String, com.simperfect.commons.cache.ao.SkillAO>
* @author 王金城
* @date 2023/6/13
*/
@Bean("skillCacheRedisTemplate")
public RedisTemplate<String, SkillAO> skillCacheRedisTemplate() {
RedisTemplate<String, SkillAO> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setValueSerializer(SimperfectCacheRedisSerializer.SKILL);
redisTemplate.setHashKeySerializer(RedisSerializer.string());
redisTemplate.setHashValueSerializer(SimperfectCacheRedisSerializer.SKILL);
return redisTemplate;
}
}
SimperfectCacheRedisSerializer 是我创建的常量,如下:
注意
如果想要支持 java.time
包内的序列化(比如:LocalDateTime
类),那么务必使用 Jackson2ObjectMapperBuilder.json().build()
创建 ObjectMapper
。
public class SimperfectCacheRedisSerializer {
/**
* 技能信息缓存序列化对象
*/
public static final Jackson2JsonRedisSerializer<SkillAO> SKILL = new Jackson2JsonRedisSerializer<>(Jackson2ObjectMapperBuilder.json().build(), SkillAO.class);
/**
* Object 类型序列化对象
**/
public static final Jackson2JsonRedisSerializer<Object> OBJECT = new Jackson2JsonRedisSerializer<>(Jackson2ObjectMapperBuilder.json().build(), Object.class);
}
如果你想序列化泛型对象中依旧存在泛型时可以 使用 TypeFactory
和 TypeReference
进行如下处理
public class SimperfectCacheRedisSerializer {
/**
* 技能信息缓存序列化对象
*/
public static final Jackson2JsonRedisSerializer<List<SkillAO>> SKILL = new Jackson2JsonRedisSerializer<>(
Jackson2ObjectMapperBuilder.json().build(),
TypeFactory.defaultInstance().constructType(new TypeReference<List<SkillAO>>() {
})
)
}