redis系列三-springboot如何使用redis做缓存及缓存注解的用法总结1. 概述本文介绍spring boot 如何使用Redis做缓存,如何对redis 缓存进行定制化配置(如key的有效期)以及spring boot 如何初始化redis做缓存。
使用具体的代码介绍了@Cacheable,@CacheEvict,@CachePut,@CacheConfig等注解及其属性的用法。
2. spring boot集成redis2.1. application.properties配置application.properties,包含如下信息:指定缓存的类型配置redis的服务器信息请不要配置spring.cache.cache-names值,原因后面再说## 缓存# spring.cache.cache-names=book1,book2spring.cache.type=REDIS# REDIS (RedisProperties)spring.redis.database=0spring.redis.host=192.168.188.7spring.redis.password=spring.redis.port=6379spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0spring.redis.pool.max-active=100spring.redis.pool.max-wait=-1123456789101112131234567891 01112132.2. 配置启动类@EnableCaching: 启动缓存重新配置RedisCacheManager,使用新的配置的值@SpringBootApplication@EnableCaching // 启动缓存public class CacheApplication {private static final Logger log =LoggerFactory.getLogger(CacheApplication.class);public static void main(String[] args) {("Start CacheApplication.. ");SpringApplication.run(CacheApplication.class, args);}/*** 重新配置RedisCacheManager* @param rd*/@Autowiredpublic void configRedisCacheManger(RedisCacheManager rd){rd.setDefaultExpiration(100L);}}123456789101112131415161718192012345678910111213141 51617181920经过以上配置后,redis缓存管理对象已经生成。
下面简单介绍spring boot如何初始化redis缓存。
2.3. spring boot 如何初始化redis做缓存缓存管理接口org.springframework.cache.CacheManager,spring boot就是通过此类实现缓存的管理。
redis对应此接口的实现类是org.springframework.data.redis.cache.RedisCacheManager。
下面介绍此类如何生成。
首先我们配置application.properties的spring.redis.* 属性后@EnableCaching后,spring会执行RedisAutoConfiguration,初始化RedisTemplate和StringRedisTemplate@Configuration@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })@EnableConfigurationProperties(RedisProperties.class)public class RedisAutoConfiguration {/*** Standard Redis configuration.*/@Configurationprotected static class RedisConfiguration {….@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {RedisTemplate template = new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}@Bean@ConditionalOnMissingBean(StringRedisTemplate.class) public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}}} 1234567891011121314151617181920212223242526272829303 1323334123456789101112131415161718192021222324252627 28293031323334然后RedisCacheConfiguration会将RedisAutoConfiguration生成的RedisTemplate注入方法生成RedisCacheManager 后。
@Configuration@AutoConfigureAfter(RedisAutoConfiguration.class)@ConditionalOnBean(RedisTemplate.class)@ConditionalOnMissingBean(CacheManager.class)@Conditional(CacheCondition.class)class RedisCacheConfiguration {private final CacheProperties cacheProperties;private final CacheManagerCustomizers customizerInvoker;RedisCacheConfiguration(CacheProperties cacheProperties,CacheManagerCustomizers customizerInvoker) {this.cacheProperties = cacheProperties;this.customizerInvoker = customizerInvoker;}@Beanpublic RedisCacheManager cacheManager(RedisTemplate redisTemplate) {RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);cacheManager.setUsePrefix(true);List cacheNames =this.cacheProperties.getCacheNames();if (!cacheNames.isEmpty()) {cacheManager.setCacheNames(cacheNames);}returnthis.customizerInvoker.customize(cacheManager);}} 1234567891011121314151617181920212223242526272829301 23456789101112131415161718192021222324252627282930 根据以上的分析,我们知道在spring已经帮我们生成一个RedisCacheManager并进行了配置。
最后我们再可以对这个RedisCacheManager进行二次配置,这里只列出配置key的有效期/*** 重新配置RedisCacheManager* @param rd*/@Autowiredpublic void configRedisCacheManger(RedisCacheManager rd){rd.setDefaultExpiration(100L);}123456789123456789注意:请不要在applicaion.properties中配置:spring.cache.cache-names=book1,book2,否则会导致我们新的配置无法作用到这些配置的cache上。
这是因为RedisCacheConfiguration 初始化RedisCacheManager后,会立即调用RedisCacheConfiguration 的初始化cache,而此时configRedisCacheManger还没有执行此方法,使得我们的配置无法启作用。
反之,如果不配置,则后创建cache,会使用我们的配置。
3. spring缓存注解的用法上节已经介绍如何配置缓存,这节介绍如何使用缓存。
3.1 辅助类下方会使用到的辅助类Book:public class Book implements Serializable {private static final long serialVersionUID = 2629983876059197650L;private String id;private String name; // 书名private Integer price; // 价格private Date update; //public Book(String id, String name, Integer price, Date update) {super();this.id = id; = name;this.price = price;this.update = update;}// set/get略}1234567891011121314151617181234567891011121314151617 18BookQry : 封装请求类public class BookQry {private String id;private String name; // 书名// set/get略}12345671234567AbstractService抽象类:初始化repositoryBook 值,模拟数据库数据。