Spring Boot 2.X整合Spring-cache,让你的网站速度飞起来

news/2024/5/9 19:30:48/文章来源:https://blog.csdn.net/zhipengfang/article/details/117454600

计算机领域有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来。

本文目录

一、Spring Cache介绍二、缓存注解介绍三、Spring Boot+Cache实战1、pom.xml引入jar包2、启动类添加@EnableCaching注解3、配置数据库和redis连接4、配置CacheManager5、使用缓存注解6、查看缓存效果7、注意事项

一、Spring Cache介绍

Spring 3.1引入了基于注解的缓存(cache)技术,它本质上是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种注解,就能够达到缓存方法的效果。

Spring Cache接口为缓存的组件规范定义,包含缓存的各种操作集合,并提供了各种xxxCache的实现,如RedisCache,EhCacheCache,ConcurrentMapCache等;

项目整合Spring Cache后每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过,如果有就直接从缓存中获取结果,没有就调用方法并把结果放到缓存。

二、缓存注解介绍

对于缓存声明,Spring的缓存提供了一组java注解:

  • @CacheConfig:设置类级别上共享的一些常见缓存设置。

  • @Cacheable:触发缓存写入。

  • @CacheEvict:触发缓存清除。

  • @Caching 将多种缓存操作分组

  • @CachePut:更新缓存(不会影响到方法的运行)。

@CacheConfig
该注解是可以将缓存分类,它是类级别的注解方式。我们可以这么使用它。
这样的话,UserServiceImpl的所有缓存注解例如@Cacheable的value值就都为user。

@CacheConfig(cacheNames = "user")
@Service
public class UserServiceImpl implements UserService {}

@Cacheable
一般用于查询操作,根据key查询缓存.

  1. 如果key不存在,查询db,并将结果更新到缓存中。

  2. 如果key存在,直接查询缓存中的数据。

    //查询数据库后 数据添加到缓存@Override@Cacheable(cacheNames = "cacheManager", key = "'USER:'+#id", unless = "#result == null")public User getUser(Integer id) {return repository.getUser(id);}

@CachePut
@CachePut标注的方法在执行前不会去检查缓存中是否存在,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

    //修改数据后更新缓存@Override@CachePut(cacheNames = "cacheManager", key = "'USER:'+#updateUser.id", unless = "#result == null")public User updateUser(User updateUser) {return repository.save(updateUser);}

@CacheEvict
根据key删除缓存中的数据。allEntries=true表示删除缓存中的所有数据。

    //清除一条缓存,key为要清空的数据@Override@CacheEvict(cacheNames = "cacheManager", key = "'USER:'+#id")public void deleteUser(Integer id) {repository.deleteById(id);}

三、Spring Boot+Cache实战

1、pom.xml引入jar包

<!-- 引入缓存 starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- 引入 redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、启动类添加@EnableCaching注解

@EnableCaching注解是spring framework中的注解驱动的缓存管理功能,当你在配置类(@Configuration)上使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。

启动类部分代码如下:

@SpringBootApplication
@EnableCaching
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

3、配置数据库和redis连接

application.properties部分配置如下:

#配置数据源信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.1:3306/test
spring.datasource.username=root
spring.datasource.password=1234
#配置jpa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true
# Redis服务器地址
spring.redis.host=192.168.1.1
# database
spring.redis.database = 1
# Redis服务器连接端口 使用默认端口6379可以省略配置
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=1234
# 连接池最大连接数(如果配置<=0,则没有限制 )
spring.redis.jedis.pool.max-active=8

4、配置CacheManager

WebConfig.java部分配置如下:

@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {//缓存配置对象RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //设置缓存的默认超时时间:30分钟.disableCachingNullValues()             //如果是空值,不缓存.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))         //设置key序列化器.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer())));  //设置value序列化器return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)).cacheDefaults(redisCacheConfiguration).build();}

5、使用缓存注解

UserServiceImpl.java中使用缓存注解示例如下:

//查询数据库后 数据添加到缓存@Override@Cacheable(cacheNames = "cacheManager", key = "'USER:'+#id", unless = "#result == null")public User getUser(Integer id) {return repository.getUser(id);}//清除一条缓存,key为要清空的数据@Override@CacheEvict(cacheNames = "cacheManager", key = "'USER:'+#id")public void deleteUser(Integer id) {repository.deleteById(id);}//修改数据后更新缓存@Override@CachePut(cacheNames = "cacheManager", key = "'USER:'+#updateUser.id", unless = "#result == null")public User updateUser(User updateUser) {return repository.save(updateUser);}

6、查看缓存效果

启动服务后,访问两次http://localhost:8090/getUser/2接口,从打印日志可以看到,第一次请求打印了sql说明查询了数据库,耗时960,而第二次直接查询的缓存耗时66,增加缓存后速度提升非常明显。

postman访问截图
日志截图

7、注意事项

Spring cache是基于Spring Aop来动态代理机制来对方法的调用进行切面,这里关键点是对象的引用问题,如果对象的方法是内部调用(即 this 引用)而不是外部引用,则会导致 proxy 失效,那么我们的切面就失效,也就是说上面定义的各种注释包括 @Cacheable、@CachePut 和 @CacheEvict 都会失效。

到此Spring Boot 2.X中整合Spring-cache与Redis功能全部实现,有问题欢迎留言沟通哦!
完整源码地址:https://github.com/suisui2019/springboot-study

热门内容:
  • 再见!深圳!再见!腾讯!

  • 这玩意比ThreadLocal叼多了,吓得我赶紧分享出来。

  • Spring Boot 无侵入式 实现 API 接口统一 JSON 格式返回

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_700887.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之后你会发现你原来的想法很可能…

利用WxJava实现PC网站集成微信登录功能,核心代码竟然不超过10行

最近网站PC端集成微信扫码登录&#xff0c;踩了不少坑&#xff0c;在此记录下实现过程和注意事项。本文目录 一、微信开放平台操作步骤1.创建“网站应用”2.获取AppID和AppSecret二、开发指南三、开发实战1、pom.xml引入jar包2、配置文件添加对应的配置3、初始化配置4、控制层核…

你为什么应该经常访问招聘网站?招聘网站至少有4个方面的价值!

一、缘起读大学的时候&#xff0c;有时候会感到很迷茫&#xff0c;不知道毕业之后可以做什么&#xff0c;自己能拿到多少的月薪。于是&#xff0c;就想到去参加一些公司的招聘。大二大三的时候&#xff0c;就去武大参加了武汉中地数码等3个公司的笔试。但是&#xff0c;没有交答…

从12306网站谈起虚拟主机选购注意事项

2019独角兽企业重金招聘Python工程师标准>>> “独在异乡为异客&#xff0c;每逢佳节倍思亲。”在临近年关的氛围下&#xff0c;尤其是只能通过火车才能归家的“游子”&#xff0c;是否也像笔者一样看着不能打开的12306网站望“票”兴叹呢&#xff1f;身为国内资深虚…

在任何设备上都完美呈现的30个华丽的响应式网站

如今&#xff0c;一个网站只在桌面屏幕上好看是远远不够的&#xff0c;同时也要在平板电脑和智能手机中能够良好呈现。响应式的网站是指它能够适应客户端的屏幕尺寸&#xff0c;自动响应客户端尺寸变化。在这篇文章中&#xff0c;我将向您展示在任何设备上都完美的30个华丽的响…

新浪微博推广网站的一些实践体会

本以为微博推广很难&#xff0c;每天都要刷粉刷内容的&#xff0c;也本以为做微博推广也很简单&#xff0c;一不卖产品、二不卖服务的&#xff0c;目的单纯灵活性强些&#xff0c;做了之后才发现都不是那么回事&#xff0c;微博虽然也过了“火了”&#xff0c;但新媒体还真是不…

windowsXP用户被禁用导致不能网站登录

1、查看系统事件&#xff0c;发现弹出如下的错误 2、根据上面的错误&#xff0c;我们很容易就可以判断是禁用了账户引起的 2.1后面进入计算机管理&#xff0c;再进入用户管理 2.2双击点开Internet来宾用于&#xff0c;发现此用户已经停用了。 2.3双击点开与IIS访问有关用户&…

AI 和 SEO 的结合:是福还是祸?

作者 | Vik Bogdanov翻译 | Katie,责编 | 晋兆雨头图 | 付费下载于视觉中国自成立以来&#xff0c;搜索引擎已经从基本搜索代理变成了基于人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的复杂算法。这些创新技术从两个完全相反的角度影响搜索引擎优…

【云计算】云上建站快速入门:博客、论坛、CMS、电子商务网站统统

免费网站怎么建&#xff0c;空间也能免费吗?免费网站怎么建立&#xff0c;免费网站并非免费空间互联网真的有免费建站这等好事&#xff1f;现在制作一个网站已经越来越容易了&#xff0c;只要知道清晰的流程之后都是可以很快的建好一个企业或者个人网站的&#xff01;免费的建…

PrestaShop 网站后台配置(六)

转载请注明出处&#xff1a;http://www.cnblogs.com/zhong-dev/p/4943023.html 网店版本 Prestashop v1.6 配置邮箱店铺在客户下单之后&#xff0c;可以自动给客户发送邮件&#xff0c;要实现这个功能首先一点服务器要支持邮件功能。现在网店的运行环境是 amh 环境&#xff0c…

在 Azure 网站上使用 Memcached 改进 WordPress

编辑人员注释&#xff1a;本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写。 您是否希望改善在 Azure 网站服务上运行的 WordPress 网站的性能&#xff1f;如果是&#xff0c;那么您就需要一个可帮助加快您…

微软惹的祸!CVPR提交网站最后1小时被挤崩,官方紧急延长36小时

视学算法报道 编辑&#xff1a;小咸鱼 好困【新智元导读】CVPR提交网站宕机了&#xff0c;而且还是在截止时间前的最后1个小时&#xff01;于是DDL被紧急延长了1天半。什么&#xff1f;CVPR 2022的论文提交网站居然在deadline之前一个小时崩掉了&#xff01;赶着DDL提交论文的…

域名年龄-SEO搜索引擎优化

为什么80%的码农都做不了架构师&#xff1f;>>> 域名年龄-SEO搜索引擎优化 在我们创建一个新的网站时&#xff0c;我们首先考虑到的是去注册一个新的域名。 有时发现我们 要注册的域名已经被注册了&#xff0c;于是就有两种方式&#xff1a; 一、重新注册另外的…

网络空间安全之信息追踪——学习笔记 利用门户网站,综合信息追踪

企业信息追踪与防护&#xff1a; 对于一个公司来说&#xff0c;只要牵扯到公司任一信息&#xff0c;都可以称之为公司的机密文件&#xff01; 知名门户网站搜索&#xff1a; 新华网&#xff1a;http://www.xinhuanet.com/ 党中央直接部署的&#xff0c;重大影响力&#xff01; …

1.lamp网站构建

bs、cs结构 及优缺点 s-server , c-client , b-broswer cs结构&#xff1a;客户端--服务器 &#xff0c; 比如QQ&#xff0c;首先要下载QQ客户端&#xff0c;之后是客户端与服务器连接 &#xff0c; bs结构&#xff1a;浏览器--服务器 &#xff0c; 浏览器直接登录的&#xff…

大型网站架构演变和知识体系

转载&#xff1a;http://www.blogjava.net/BlueDavy/archive/2008/09/03/226749.html 大型网站架构演变和知识体系之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的…

作者免费分享自己论文也不行,知名学术社交网站被判侵权,此前已下架20万余篇论文...

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达来源丨量子位编辑丨极市平台导读 知名学术社交网站ResearchGate被判下架50篇受版权保护的论文&#xff0c;并被要求对侵权内容负责。这场关于“开放获取”的官司&#xff0c…

强烈推荐可以玩上一整天的游戏网站

作为科技公司的一员&#xff0c;小普推荐能玩一整天的网站&#xff0c;当然是和编程有关的啦~ 强烈推荐一款以游戏形式学习python的网站&#xff1a; ▐ CheckIO CheckIO是一个Python代码游戏网站&#xff0c;用户可以通过编程来解决游戏中的各种任务&#xff0c;还可以与其他开…

添加HTML网站图标Favicon

网站图标是显示在浏览器选项卡中页面标题旁边的小图像。 <link rel"icon" type"image/x-icon" href"./favicon.ico"> 示例代码&#xff1a; <!DOCTYPE html> <html> <head><title>My Page Title</title>…

让你的网站支持 Emoji

SegmentFault有用户提出要支持Emoji表情输入&#xff0c;就研究了一下&#xff1a; 要记得备份数据库。 首先Mysql数据库在5.5.3之后开始支持utf8mb4字符集&#xff0c;所以mysql版本是5.5.3&#xff0b;的都可以设置让数据库存储Emoji表情&#xff0c;如果你的应用有移动端的&…