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:条件符合则缓存。
使用步骤
| 12
 3
 4
 5
 6
 
 | <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
 复制代码
 
 | 
- 修改配置文件application.yml,添加Redis的连接配置;
| 12
 3
 4
 5
 6
 7
 8
 
 | spring:redis:
 host: 192.168.6.139
 database: 0
 port: 6379
 password:
 timeout: 1000ms
 复制代码
 
 | 
- 在启动类上添加@EnableCaching注解启动缓存功能;
| 12
 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注解;
| 12
 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代码如下;
| 12
 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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。