缓存在实际开发中肯定会遇到的,为了减轻数据库的压力,很多的项目都使用了缓存来达到数据快速访问,可以给用户达到良好的体验。不然,客户一个请求响应半天,谁受得了。
但是,很多人在使用缓存中,会遇到缓存带来的麻烦。比如:数据库查询出来的数据和缓存数据不一致的问题。就是缓存滞后的问题导致的。
缓存的使用很简单,只需要在主类上加上@EnableCaching注解即可开启。
@SpringBootApplication @EnableAutoConfiguration @EnableCaching public class SpringbootcacheApplication { public static void main(String[] args) { SpringApplication.run(SpringbootcacheApplication.class, args); } }复制代码
只有在这里开启注解,后面才可以使用缓存,否则无效的。
@CacheConfig全局配置缓存,这个只需要配置到类上,就可以不需要二次配置,接收一个缓存的名字cacheNames。这里定义了缓存名字,其他地方就自动使用该缓存名字进行缓存。
主要缓存注解。这个注解就是起到缓存查询不到,自动到数据库查询的功能效果。属性:cacheNames:缓存名字,condtion:缓存的条件,unless:不缓存的条件。缓存内部实现也是一个key value的形式。指定了key,就以key作为建进行缓存处理。
这个注解主要是清除缓存用的。我可以在更新,删除的时候,进行注解删除缓存。可以指定key和condition。这个key和@Cacheable里面的key保持一致 ,就可以删除对应的缓存。
@Service @CacheConfig(cacheNames = "articleCache") public class ArticleService { private AtomicInteger count =new AtomicInteger(0); @Autowired private ArticleMapper articleMapper; /** * 增加一篇文章 每次就进行缓存 * @return */ @CachePut public Integer addArticle(Article article){ Integer result = articleMapper.addArticle(article.getTitle(), article.getAuthor(), article.getContent(), article.getFileName()); if (result>0) { Integer lastInertId = articleMapper.getLastInertId(); System.out.println("--执行增加操作--id:" + lastInertId); } return result; } /** * 获取文章 以传入的id为键,当state为0的时候不进行缓存 * @param id 文章id * @return */ @Cacheable(key = "#id",unless = "#result.state==0") public Article getArticle(Integer id) { try { //模拟耗时操作 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } final Article artcile = articleMapper.getArticleById(id); System.out.println("--执行数据库查询操作"+count.incrementAndGet()+"次"+"id:"+id); return artcile; } /** * 通过id更新内容 清除以id作为键的缓存 * * @param id * @return */ @CacheEvict(key = "#id") public Integer updateContentById(String contetnt, Integer id) { Integer result = articleMapper.updateContentById(contetnt, id); System.out.println("--执行更新操作id:--"+id); return result; } /** * 通过id移除文章 * @param id 清除以id作为键的缓存 * @return */ @CacheEvict(key = "#id") public Integer removeArticleById(Integer id){ final Integer result = articleMapper.removeArticleById(id); System.out.println("执行删除操作,id:"+id); return result; } }复制代码
这里缓存加在service层来实现,具体的实现都是key为id作为建来保存,然后根据key来更新删除缓存。
本篇博客介绍了springBoot中缓存的一些使用方法,如何在开发中使用缓存?怎样合理的使用都是值得我们学习的地方,缓存能大大提升程序的响应速度,提升用户体验,不过它适用的场景也是读多写少的业务场景,如果数据频繁修改,缓存将会失去意义,每次还是执行的数据库操作!复制代码
欢迎大家关注我