Springboot2.0缓存,集成Redis

tech2026-01-08  3

文章目录

基本注解介绍@Cacheable介绍参数 @CachePut介绍参数 @CacheEvict介绍参数 @CacheConfig介绍参数 整合redis作为缓存redis启动器坐标redisTemplate和stringRedisTemplateRedisSerializer序列化机制RedisTemplate的默认序列化自定义RedisTemplate,用Json序列化springboot2.0自定义CacheManger定义多个CacheManger的注意事项编程式存放缓存

基本注解介绍

@Cacheable

介绍

标注在方法上,存放方法的返回结果到缓存中。在目标方法执行之前执行。调用目标方法时,先去查询缓存,根据key查询数据,缓存中有对应数据的话,直接从缓存中取。如果没有对应数据的话,就执行目标方法,将返回结果放到缓存中

参数

cacheNames/value:指定缓存组件的名字 key:缓存数据使用的key,默认是方法的参数值 keyGenerator:key的生成器,可以指定key的生成器组件id cacheManager/cacheResolver:缓存管理器/缓存解析器 二选一 condition:指定符合条件的才缓存 unless:当unless指定的条件为true,就不缓存。可以获取结果进行判断 sync:是否使用异步模式,默认为false

@CachePut

介绍

标注在方法上,在目标方法执行之后执行,将返回结果存放到缓存。

参数

cacheNames/value:指定缓存组件的名字 key:缓存数据使用的key,默认是方法的参数值 keyGenerator:key的生成器,可以指定key的生成器组件id cacheManager/cacheResolver:缓存管理器/缓存解析器 二选一 condition:指定符合条件的才缓存 unless:当unless指定的条件为true,就不缓存。可以获取结果进行判断

@CacheEvict

介绍

标注在方法上,清空缓存。可以通过设置beforeInvocation参数,设置在目标方法之前还是之后执行。

参数

cacheNames/value:指定缓存组件的名字 key:缓存数据使用的key,默认是方法的参数值 keyGenerator:key的生成器,可以指定key的生成器组件id cacheManager/cacheResolver:缓存管理器/缓存解析器 二选一 condition:指定符合条件的才清除 allEntries:清楚组件中所有缓存。默认为false beforeInvocation:在方法执行之前执行。默认为false。

@CacheConfig

介绍

标注在类上,设置公共属性。

参数

cacheNames keyGenerator cacheManager cacheResolver

整合redis作为缓存

redis启动器坐标

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>

redisTemplate和stringRedisTemplate

在Redis的自动配置类中,提供了两个bean来进行redis相关操作。StringRedisTemplate常用于操作String类型的数据,RedisTemplate常用于操作我们自定义的对象,需要将对象序列化进行存储。

RedisSerializer序列化机制

来到RedisSerializer的接口下,可以看到它有很多的实现类,其中JdkSerializationRedisSerializer就是使用JDK序列化,Jackson2JsonRedisSerializer就是转成Json。

RedisTemplate的默认序列化

在RedisTemplate的类下可以看到RedisTemplaate默认使用的序列化机制是JdkSerializationRedisSerializer。

自定义RedisTemplate,用Json序列化

@Configuration public class MyRedisConfig { @Bean public RedisTemplate<Object, Payment> redisTemplate01(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { RedisTemplate<Object, Payment> template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Payment.class); template.setDefaultSerializer(jackson2JsonRedisSerializer); return template; } }

为了更高的可读性,我们可以将对象转成Json进行存储,这需要使用jackson2JsonRedisSerializer。重新向容器中添加一个redisTemplate01,将他的默认序列化机制改成Json序列化。

springboot2.0自定义CacheManger

springboot2以前自定义CacheManger需要注入RedisTemplate。现在直接通过RedisCacheConfiguration设置序列化机制等属性。

@Bean public RedisCacheManager paymentCacheManager(RedisConnectionFactory factory){ Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Payment.class); RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(15)) //设置缓存过期时间 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)); //s设置Json序列化机制 RedisCacheManager redisCacheManager = RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build(); return redisCacheManager; }

还可以通过RedisCacheConfiguration设置很多其他属性。

定义多个CacheManger的注意事项

如果定义多个CacheManger,需要在其中一个上面标注@Primary。在使用缓存注解时,通过cacheManager属性指定使用的CacheManger。

编程式存放缓存

注入使用的CacheManger: @Autowired CacheManager userCacheManger;

获取缓存组件,存放数据 Cache cache = userCacheManger.getCache(“user”); cache.put(“custom”,user);

最新回复(0)