前言
对一个应用系统而言,把经常使用且很少更新的数据加入到缓存,是非常有必要的。因为从缓存中获取数据的速度要优于数据库,把redis内存型数据库作为缓存是非常常见的做法。
当项目集成redis框架后,就可以使用StringRedisTemplate对象对数据进行缓存,优先从redis中获取数据,若获取不到再查询数据库。当缓存数据较多时,每次都需要判断,代码未免有些臃肿。可使用方法加@Cacheable注解解决,但需要避免踩坑。
失效场景
@Cacheable注解是基于spring aop切面实现,必须走代理才有效,开发过程中有些场景会导致不能缓存或缓存失效。经过这两天的踩坑,总结失效的情况有以下三点:
1、同类或子类调用父类带有缓存注解的方法
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Cacheable(cacheNames = "user", key = "#id", unless = "#result==null")
public User getUserById(Integer id){
return userDao.getUserById(id);
}
public void updateUser(User user) throws Exception{
User user = this.getUserById(user.getId());
if(user == null){
throw new Exception(