Spring还可以这样用缓存,你知道吗?
大家在项目开发过程中,或多或少都用过缓存,为了减少数据库的压力,把数据放在缓存当中,当访问的请求过来时,直接从缓存读取。缓存一般都是基于内存的,读取速度比较快,市面上比较常见的缓存有:memcache、redis、mongodb、guava cache等。
缓存的常规用法
大家使用缓存时,常用的逻辑时这样的:
- 根据条件生成key;
- 从缓存中读取数据,若成功读取数据,则返回;
- 若数据不存在,根据条件从数据库读取;
- 将从数据库中读取的数据放入缓存;
- 返回数据;
每一个使用缓存的场景,上面的逻辑都要重写一遍,是不是很烦躁,是不是很浪费时间。有没有简单的方法完成上面的逻辑?当然有了,这就是今天要向大家介绍的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还可以这样用缓存,你知道吗?的更多相关文章
- 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)
Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...
- spring boot redis缓存JedisPool使用
spring boot redis缓存JedisPool使用 添加依赖pom.xml中添加如下依赖 <!-- Spring Boot Redis --> <dependency> ...
- 基于Spring的Web缓存
缓存的基本思想其实是以空间换时间.我们知道,IO的读写速度相对内存来说是非常比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上.那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端 ...
- 使用Spring提供的缓存抽象机制整合EHCache为项目提供二级缓存
Spring自身并没有实现缓存解决方案,但是对缓存管理功能提供了声明式的支持,能够与多种流行的缓存实现进行集成. Spring Cache是作用在方法上的(不能理解为只注解在方法上),其核心思想是 ...
- spring中使用缓存
一.启用对缓存的支持 Spring 对缓存的支持最简单的方式就是在方法上添加@Cacheable和@CacheEvict注解, 再添加注解之前,必须先启用spring对注解驱动的支持,基于java的配 ...
- spring整合redis缓存,以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
maven项目中在pom.xml中依赖2个jar包,其他的spring的jar包省略: <dependency> <groupId>redis.clients</grou ...
- 分布式数据存储 之 Redis(二) —— spring中的缓存抽象
分布式数据存储 之 Redis(二) -- spring中的缓存抽象 一.spring boot 中的 StringRedisTemplate 1.StringRedisTemplate Demo 第 ...
- 使用maven简单搭建Spring mvc + redis缓存
注:此文参考并整合了网上的文章 <spring缓存机制>:http://blog.csdn.net/sidongxue2/article/details/30516141 <配置 S ...
- spring boot redis 缓存(cache)集成
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
随机推荐
- 梭子鱼VS多备份 虽殊途却同归
备份,对于企业来说,不仅是一个已经拥有多年历史的传统IT工作,还关系着企业自身的生死存亡.在云计算时代下,备份业务成为企业的必选项,已经成为云计算服务最为热门的领域之一.基于云的备份正在深刻改变着备份 ...
- 用 jQuery.getJSON() 跨域请求 JSON 数据
$.getJSON()可以理解为特殊形式的$.ajax(),手册里的说明好复杂,这里只记录一下用到的跨域请求. 先说在同一域名下,js发送数据到php,php返回JSON数据: $.getJSON(' ...
- flask(四)
1.Flask-Session from flask import session,Flask from flask_session import Session #导入 from redis imp ...
- Spring之bean后处理器
Bean后处理器是一种特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法.由于该Bean是由其它Bean自动调用执行,不是程序员手工调用,故此Bean无须id属性.需要做的是, ...
- 解决Nextcloud 无法删除目录
1)进入维护模式 sudo -u www php /www/wwwroot/192.168.40.159/occ maintenance:mode --on 2)使用mysql命令行工具,在nextc ...
- netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理 ...
- 使用Gson封装和解析JSON
案例:判断用户名是否存在 在jsp页面使用ajax $("#username").change(function(){ var username = $(this).val(); ...
- Python自学day-14
一.默认创建的HTML5文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- CentOS 7 使用 HP 打印机
通常 hp 打印机应该是直接就能用的,但 centos 7 就一直遇到 printing job stopped 的情况.查看 http://localhost:631/printers/ 并没什么用 ...
- Codeforces 755D:PolandBall and Polygon(思维+线段树)
http://codeforces.com/problemset/problem/755/D 题意:给出一个n正多边形,还有k,一开始从1出发,向第 1 + k 个点连一条边,然后以此类推,直到走完 ...