大家在项目开发过程中,或多或少都用过缓存,为了减少数据库的压力,把数据放在缓存当中,当访问的请求过来时,直接从缓存读取。缓存一般都是基于内存的,读取速度比较快,市面上比较常见的缓存有:memcache、redis、mongodb、guava cache等。

缓存的常规用法

大家使用缓存时,常用的逻辑时这样的:

  1. 根据条件生成key;
  2. 从缓存中读取数据,若成功读取数据,则返回;
  3. 若数据不存在,根据条件从数据库读取;
  4. 将从数据库中读取的数据放入缓存;
  5. 返回数据;

每一个使用缓存的场景,上面的逻辑都要重写一遍,是不是很烦躁,是不是很浪费时间。有没有简单的方法完成上面的逻辑?当然有了,这就是今天要向大家介绍的Spring Cache。

Spring Cache

Spring Cache并不神秘,而且使用起来非常的方便。它是注解组成的,最常用的一个注解是@Cacheable。这个注解是在方法上使用的,当使用了注解的方法被调用时,会先从缓存中查询,如果缓存中不存在,则执行方法,然后将方法的返回值放入缓存中。具体的使用方法如下:

首先,我们在IDEA中使用Spring Boot搭建环境,在选择依赖的页面中,我们选择了Lombok和Cache,最主要的选择Cache哦~ 项目搭建完毕后,我们看一下pom.xml的依赖:

我们看到在依赖中自动添加了cache。接下来我们要在SpringBoot的启动类上加上使用cache的注解@EnableCaching,如图:

然后我们编写测试的controller,如下:

我们使用@RestController注解,所以它返回的是Json格式的结果。然后在方法上使用了@Cacheable注解,这是我们今天的主角。

  • cacheNames:当系统中有多个缓存时,指定该方法使用其中的哪几个缓存。
  • key:缓存的key,可以使用spEL表达式,上面的例子中,使用了入参name。

还有其他的关键字,在这里没有列出来,比如:

  • sync :true或false,当并发量非常大时,将同步开启,可以保证只有一个线程执行方法,其他线程将等待,然后从缓存中读取数据。
  • condition:使用缓存的条件。
  • keyGenerator:指定key的生成器。

我们启动项目,并在浏览器第一次访问http://localhost:8080/cache/test?name=allen,结果响应很慢,过了5秒后,页面显示结果:

我们在看一下后台日志:

打印语句打印出来了,说明第一次访问时,是执行了方法的。我们再在浏览器请求相同的地址,结果返回了相同的结果,而且后台没有打印出日志,和上面两张图一模一样。说明这次请求走了缓存,方法并没有执行。

总结

怎么样?@Cacheable很好用吧,大家赶快动手,在项目中实践一下吧,有问题评论区留言哦

Spring还可以这样用缓存,你知道吗?的更多相关文章

  1. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  2. spring boot redis缓存JedisPool使用

    spring boot redis缓存JedisPool使用 添加依赖pom.xml中添加如下依赖 <!-- Spring Boot Redis --> <dependency> ...

  3. 基于Spring的Web缓存

    缓存的基本思想其实是以空间换时间.我们知道,IO的读写速度相对内存来说是非常比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上.那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端 ...

  4. 使用Spring提供的缓存抽象机制整合EHCache为项目提供二级缓存

      Spring自身并没有实现缓存解决方案,但是对缓存管理功能提供了声明式的支持,能够与多种流行的缓存实现进行集成. Spring Cache是作用在方法上的(不能理解为只注解在方法上),其核心思想是 ...

  5. spring中使用缓存

    一.启用对缓存的支持 Spring 对缓存的支持最简单的方式就是在方法上添加@Cacheable和@CacheEvict注解, 再添加注解之前,必须先启用spring对注解驱动的支持,基于java的配 ...

  6. spring整合redis缓存,以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    maven项目中在pom.xml中依赖2个jar包,其他的spring的jar包省略: <dependency> <groupId>redis.clients</grou ...

  7. 分布式数据存储 之 Redis(二) —— spring中的缓存抽象

    分布式数据存储 之 Redis(二) -- spring中的缓存抽象 一.spring boot 中的 StringRedisTemplate 1.StringRedisTemplate Demo 第 ...

  8. 使用maven简单搭建Spring mvc + redis缓存

    注:此文参考并整合了网上的文章 <spring缓存机制>:http://blog.csdn.net/sidongxue2/article/details/30516141 <配置 S ...

  9. spring boot redis 缓存(cache)集成

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

随机推荐

  1. vs中debug的一个小技巧 -- debug时忽略某段代码

    #line 这是C#中的预处理命令 Visual Studio 2008 Visual Studio 2005 Visual Studio 2012 #line hidden 指令对调试器隐藏若干连续 ...

  2. CentOS7 Vim自动补全插件----YouCompleteMe安装与配置

    最近刚装了新系统CentOS7,想要把编码环境配置一下,使用Vim编写程序少不了使用自动补全插件,我以前用的是neocomplcache+code_complete+omnicppcomplete.但 ...

  3. 极简代理IP爬取代码——Python爬取免费代理IP

    这两日又捡起了许久不碰的爬虫知识,原因是亲友在朋友圈拉人投票,点进去一看发现不用登陆或注册,觉得并不复杂,就一时技痒搞一搞,看看自己的知识都忘到啥样了. 分析一看,其实就是个post请求,需要的信息都 ...

  4. 分布式流处理框架 Apache Storm —— 编程模型详解

    一.简介 二.IComponent接口 三.Spout     3.1 ISpout接口     3.2 BaseRichSpout抽象类 四.Bolt     4.1 IBolt 接口     4. ...

  5. 使用豆瓣的pip源安装python模块

    1.指定豆瓣pip源安装Django pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com ...

  6. JVM底层实现与总结

    一.类加载器 1.BootstrapClassLoader(启动类加载器) 它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME% ...

  7. vue history 模式打包部署在域名的二级目录的配置指南

    最近在做项目,需要把项目部署在域名下的二级目录,并且是在用vue-router的history 模式. 我们都知道vue-router 的两种前端基本访问模式 hash 和history .hash ...

  8. 推荐一个高效,易用功能强大的可视化API管理平台

    项目管理 提供基本的项目分组,项目管理,接口管理功能 接口管理 友好的接口文档,基于websocket的多人协作接口编辑功能和类postman测试工具,让多人协作成倍提升开发效率 MockServer ...

  9. LaTeX 中插入GIF图片

    参见博文:liam.page 和 voidcn 前提条件 安装 ImageMagick 软件 (因为要把 gif 图片转换成 png 序列),使用它的命令行工具 convert.exe 命令行下把 g ...

  10. 【React入门】React父子组件传值demo

    公司一直是前后端分离的,最近集团开始推进中后台可视化开发组件(基于React封装),跟师兄聊起来也听说最近对后台开发人员的前端能力也是越来越重视了.所以作为一名后端,了解下前端的框架对自己也是大有好处 ...