All You Need To Know About JSON Parsing With Jackson
对应spring 集成redis来实现,需要主要在序列化 对象过程中,如果使用Jackson来序列化需要注意Jackson相关的配置.目前就先补充这么多
下面是摘录官网的文章来大概展示然后集成最后会补充注意事项 Introduction to Spring Data Redis | Baeldung , Spring Data Redis 最佳实践! - 掘金
Spring Cache 简介
当Spring Boot 结合Redis来作为缓存使用时,最简单的方式就是使用Spring Cache了,使用它我们无需知道Spring中对Redis的各种操作,仅仅通过它提供的@Cacheable 、@CachePut 、@CacheEvict 、@EnableCaching等注解就可以实现缓存功能。
常用注解
@EnableCaching
开启缓存功能,一般放在启动类上。
@Cacheable
使用该注解的方法当缓存存在时,会从缓存中获取数据而不执行方法,当缓存不存在时,会执行方法并把返回结果存入缓存中。一般使用在查询方法上
,可以设置如下属性:
- value:缓存名称(必填),指定缓存的命名空间;
- key:用于设置在命名空间中的缓存key值,可以使用SpEL表达式定义;
- unless:条件符合则不缓存;
- condition:条件符合则缓存。
@CachePut
使用该注解的方法每次执行时都会把返回结果存入缓存中。一般使用在新增方法上
,可以设置如下属性:
- value:缓存名称(必填),指定缓存的命名空间;
- key:用于设置在命名空间中的缓存key值,可以使用SpEL表达式定义;
- unless:条件符合则不缓存;
- condition:条件符合则缓存。
@CacheEvict
使用该注解的方法执行时会清空指定的缓存。一般使用在更新或删除方法上
,可以设置如下属性:
- value:缓存名称(必填),指定缓存的命名空间;
- key:用于设置在命名空间中的缓存key值,可以使用SpEL表达式定义;
- condition:条件符合则缓存。
使用步骤
1 2 3 4 5 6
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 复制代码
|
- 修改配置文件application.yml,添加Redis的连接配置;
1 2 3 4 5 6 7 8
| spring: redis: host: 192.168.6.139 database: 0 port: 6379 password: timeout: 1000ms 复制代码
|
- 在启动类上添加@EnableCaching注解启动缓存功能;
1 2 3 4 5 6 7 8 9 10
| @EnableCaching @SpringBootApplication public class MallTinyApplication {
public static void main(String[] args) { SpringApplication.run(MallTinyApplication.class, args); }
} 复制代码
|
- 接下来在PmsBrandServiceImpl类中使用相关注解来实现缓存功能,可以发现我们获取品牌详情的方法中使用了@Cacheable注解,在修改和删除品牌的方法上使用了@CacheEvict注解;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
@Service public class PmsBrandServiceImpl implements PmsBrandService { @Autowired private PmsBrandMapper brandMapper;
@CacheEvict(value = RedisConfig.REDIS_KEY_DATABASE, key = "'pms:brand:'+#id") @Override public int update(Long id, PmsBrand brand) { brand.setId(id); return brandMapper.updateByPrimaryKeySelective(brand); }
@CacheEvict(value = RedisConfig.REDIS_KEY_DATABASE, key = "'pms:brand:'+#id") @Override public int delete(Long id) { return brandMapper.deleteByPrimaryKey(id); }
@Cacheable(value = RedisConfig.REDIS_KEY_DATABASE, key = "'pms:brand:'+#id", unless = "#result==null") @Override public PmsBrand getItem(Long id) { return brandMapper.selectByPrimaryKey(id); }
}
|
配置Redisconfig类
- 我们可以通过给RedisTemplate设置JSON格式的序列化器,并通过配置RedisCacheConfiguration设置超时时间来实现以上需求,此时别忘了去除启动类上的@EnableCaching注解,具体配置类RedisConfig代码如下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
@EnableCaching @Configuration public class RedisConfig extends CachingConfigurerSupport {
public static final String REDIS_KEY_DATABASE="mall";
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisSerializer<Object> serializer = redisSerializer(); RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(serializer); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(serializer); redisTemplate.afterPropertiesSet(); return redisTemplate; }
@Bean public RedisSerializer<Object> redisSerializer() { Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(objectMapper); return serializer; }
@Bean public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer())).entryTtl(Duration.ofDays(1)); return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration); }
} 复制代码
|
- 此时我们再次调用获取商品详情的接口进行测试,会发现Redis中已经缓存了标准的JSON格式数据,并且超时时间被设置为了1天。
Finaly重中之重就是 序列化要注意
作者:MacroZheng
链接:https://juejin.cn/post/6844904094545477640
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。