Spring实战(第四版) 第十三章 缓存数据
1、启用对缓存的支持
可以使用注解驱动缓存,大部分使用@Cacheable和@CacheEvict注解。另外需要向配置类添加@EnableCaching注解
@EnableCaching会创建一个切面并触发Spring缓存注解的切点。根据使用的注解以及缓存的状态,这个切面会从缓存中获取数据,将数据添加到缓存之中或者从缓存移除某个值。
@Configuration
@EnableCaching
public class CachingConfig {
@Bean
public EhCacheCacheManager cacheManager(CacheManager cm) {
return new EhCacheCacheManager(cm);
}
@Bean
public EhCacheManagerFactoryBean ehcache() {
EhCacheManagerFactoryBean ehCacheFactoryBean =
new EhCacheManagerFactoryBean();
ehCacheFactoryBean.setConfigLocation(
new ClassPathResource("spittr/cache/ehcache.xml"));
return ehCacheFactoryBean;
}
}
Redis缓存
public class CachingConfig {
@Bean
public CacheCacheManager cacheManager(RedisTemplate redisTeplate) {
return new RedisCacheManager(redisTemplate);
}
@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisCF) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(redisCF);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
2、为方法添加注解以支持缓存
填充缓存
- @Cache,Spring调用方法之前,首先在缓存中查找方法的返回值,如果这个值能够找到,就会返回,否则方法调用并将结果放入缓存。
- @CachePut,始终往缓存中方,调用前不检查缓存

@Cacheable("spittleCache")
public Spittle findOne(long id) {
try {
return jdbcTemplate.queryForObject(SELECT_SPITTTLE_BY_ID, new SpittleRowMapper(), id);
} catch (EmptyResultDataAccessException e) {
return null;
}
- 可以自定义缓存key
@CachePut(value = "spittleCache", key = "#result.id")
Spittle save(Spittle spittle);
- 可以根据条件设置缓存,比如下面这个如果包含NoCache文本内容就不会缓存
@Cacheable(value = "spittleCache", unless = "#result.message.contains('NoCache')")
Spittle findOne(long id)
移除缓存
@CacheEvict("spittleCache")
void remove(long spittleId);
浙公网安备 33010602011771号