@Service @Transactional @CacheConfig(cacheNames = {"myCache"}) public class TbUserServiceImpl implements TbUserService{ @PersistenceContext private EntityManager em; @Autowired private TbUserRepository tbUserRepository; //@Cacheable缓存数据:key为userList,value为返回值List<TbUser> @Cacheable(key = "'userList'") @Override public List<TbUser> list(TbUser entityVo) { System.out.println("获取list用户列表缓存数据,"+new Date()); return tbUserRepository.findAll(Example.of(entityVo)); } //@Cacheable缓存数据:key为参数id,value为返回值TbUser @Cacheable(key = "#id") @Override public TbUser get(Integer id) { System.out.println("获取数据缓存,key:"+id); Optional<TbUser> optionalE = tbUserRepository.findById(id); if (!optionalE.isPresent()) { throw new RuntimeException("ID不存在!"); } return optionalE.get(); } //@CachePut缓存新增的或更新的数据到缓存,其中缓存的名称为people,数据的key是person的id @CachePut(key = "#entityVo.id") // @CacheEvict从缓存中删除key为参数userList的数据 @CacheEvict(key = "'userList'") @Override public TbUser save(TbUser entityVo) { System.out.println("新增/更新缓存,key:"+entityVo.getId()); //entityVo传啥存啥,会全部更新 return tbUserRepository.save(entityVo); } //清空所有缓存 @CacheEvict(allEntries=true) @Override public Integer delete(Integer id) { System.out.println("清空所有缓存"); tbUserRepository.deleteById(id); return id; } }

效果演示

http://localhost:10010/tbUser/save?id=2&username=李四
调用save方法,key为2,value为当前tbUser对象的数据被缓存下来

编辑切换为居中
添加图片注释,不超过 140 字(可选)


编辑切换为居中
添加图片注释,不超过 140 字(可选)

http://localhost:10010/tbUser/get/2
当我们调用get方法时,直接获取缓存数据,控制台啥也不打印,连serviceImpl的get方法都不进去(可以打断点调试)

编辑切换为居中
添加图片注释,不超过 140 字(可选)


编辑切换为居中
添加图片注释,不超过 140 字(可选)

http://localhost:10010/tbUser/save?id=2&username=王五
当我们再次调用save方法更新username时,缓存数据也被更新

编辑切换为居中
添加图片注释,不超过 140 字(可选)


编辑切换为居中
添加图片注释,不超过 140 字(可选)

http://localhost:10010/tbUser/get/2
再次调用get接口,直接返回缓存数据,后台也是方法都不进去,啥也不打印

编辑切换为居中
添加图片注释,不超过 140 字(可选)


编辑切换为居中
添加图片注释,不超过 140 字(可选)

http://localhost:10010/tbUser/delete/2
调用delete接口,删除数据,同时删除缓存

编辑切换为居中
添加图片注释,不超过 140 字(可选)


编辑切换为居中
添加图片注释,不超过 140 字(可选)

再次调用get接口,发现缓存数据被清除,查询数据库

编辑切换为居中
添加图片注释,不超过 140 字(可选)

http://localhost:10010/tbUser/list
首次调用list接口,key为userList的,value为用户集合数据被缓存下来,再次调用直接返回缓存数据

编辑切换为居中
添加图片注释,不超过 140 字(可选)


编辑切换为居中
添加图片注释,不超过 140 字(可选)

当调用save接口,数据更新,删除key为userList的缓存,再次调用list时,重新查库并设置缓存

编辑切换为居中
添加图片注释,不超过 140 字(可选)

我们配置了缓存发呆时间,当120秒内未使用该缓存,立即过期,一直用就会一直存在
我们先同时访问两个接口list、get,list接口2分钟后再次访问,get接口不能超过2分钟是不是访问一下,结果如预期

编辑切换为居中
添加图片注释,不超过 140 字(可选)

PS:原先使用了这个jar包,有报错
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.8.1</version> </dependency>
后面改成用上面“代码编写”里pom中引的jnet.sf.ehcache下面的ar

最后的最后如果大家需要领取这套面试资料麻烦帮忙点赞+转发文章之后私信我【面试】两个字领取就可以了!