全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

在Spring Boot中如何使用数据缓存

在实际开发中,对于要反复读写的数据,最好的处理方式是将之在内存中缓存一份,频繁的数据库访问会造成程序效率低下,同时内存的读写速度本身就要强于硬盘。Spring在这一方面给我们提供了诸多的处理手段,而Spring Boot又将这些处理方式进一步简化,接下来我们就来看看如何在Spring Boot中解决数据缓存问题。

创建Project并添加数据库驱动

Spring Boot的创建方式还是和我们前文提到的创建方式一样,不同的是这里选择添加的依赖不同,这里我们添加Web、Cache和JPA依赖,如下图:

 

创建成功之后,接下来添加数据库驱动,我还是使用MySQL,在pom.xml中添加数据库驱动,如下:

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.40</version>
 </dependency>

配置application.properties

这个application.properties的配置还是和初识在Spring Boot中使用JPA一样,各个参数的含义我这里也不再赘述,我们直接来看代码:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/sang?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=sang

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true

创建实体类

@Entity
public class Person {
 @Id
 @GeneratedValue
 private Long id;
 private String name;
 private String address;
 private Integer age;

 public Person() {
 }

 public Long getId() {
 return id;
 }

 public void setId(Long id) {
 this.id = id;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public String getAddress() {
 return address;
 }

 public void setAddress(String address) {
 this.address = address;
 }

 public Integer getAge() {
 return age;
 }

 public void setAge(Integer age) {
 this.age = age;
 }

 public Person(Long id, String name, String address, Integer age) {
 this.id = id;
 this.name = name;
 this.address = address;
 this.age = age;
 }
}

创建实体类的Repository

public interface PersonRepository extends JpaRepository<Person,Long> {}

创建业务类

业务接口

public interface DemoService {
 public Person save(Person person);

 public void remove(Long id);

 public Person findOne(Person person);
}

实现类

@Service
public class DemoServiceImpl implements DemoService {
 @Autowired
 PersonRepository personRepository;

 @CachePut(value = "people", key = "#person.id")
 @Override
 public Person save(Person person) {
 Person p = personRepository.save(person);
 System.out.println("为id、key为" + p.getId() + "数据做了缓存");
 return p;
 }

 @CacheEvict(value = "people")
 @Override
 public void remove(Long id) {
 System.out.println("删除了id、key为" + id + "的数据缓存");
 personRepository.delete(id);
 }

 @Cacheable(value = "people", key = "#person.id")
 @Override
 public Person findOne(Person person) {
 Person p = personRepository.findOne(person.getId());
 System.out.println("为id、key为" + p.getId() + "数据做了缓存");
 return p;
 }
}@Service
public class DemoServiceImpl implements DemoService {
 @Autowired
 PersonRepository personRepository;

 @CachePut(value = "people", key = "#person.id")
 @Override
 public Person save(Person person) {
 Person p = personRepository.save(person);
 System.out.println("为id、key为" + p.getId() + "数据做了缓存");
 return p;
 }

 @CacheEvict(value = "people")
 @Override
 public void remove(Long id) {
 System.out.println("删除了id、key为" + id + "的数据缓存");
 personRepository.delete(id);
 }

 @Cacheable(value = "people", key = "#person.id")
 @Override
 public Person findOne(Person person) {
 Person p = personRepository.findOne(person.getId());
 System.out.println("为id、key为" + p.getId() + "数据做了缓存");
 return p;
 }
}

关于这个实现类我说如下几点:

1.@CachePut表示缓存新添加的数据或者更新的数据到缓存中,两个参数value表示缓存的名称为people,key表示缓存的key为person的id

2.@CacheEvict表示从缓存people中删除key为id的数据

3.@Cacheable表示添加数据到缓存中,缓存名称为people,缓存key为person的id属性。

创建Controller

@RestController
public class CacheController {
 @Autowired
 DemoService demoService;

 @RequestMapping("/put")
 public Person put(Person person) {
 return demoService.save(person);
 }

 @RequestMapping("/able")
 public Person cacheable(Person person) {
 return demoService.findOne(person);
 }

 @RequestMapping("/evit")
 public String evit(Long id) {
 demoService.remove(id);
 return "ok";
 }
}

OK ,做完这一切我们就可以来测试我们刚刚写的缓存了。

测试

看我们的Controller,我们有三个地址要测试,一个一个来。当然,在 测试之前,我们先来看看初始状态下的数据库是什么样子的:

首先我们在浏览器中访问http://localhost:8080/able?id=1,得到如下访问结果:

 

这个时候查看控制台,输出内容如下:

 

说是数据已经被缓存了,这个时候我们再继续在浏览器中刷新继续请求id为1的数据,会发现控制台不会继续打印日志出来,就是因为数据已被存于缓存之中了。

接下来我们向浏览器中输入http://localhost:8080/put?age=47&name=奥巴牛&address=米国,访问结果如下:

 

这个时候查看控制台打印的日志如下:

 

再查看数据表,数据已插入成功:

 

此时,我们在浏览器中输入http://localhost:8080/able?id=106,访问刚刚插入的这条数据,结果如下:

 

这个时候查看控制台,发现并没有数据数据,就是因为数据已经处于缓存中了。

最后我们在浏览器中输入http://localhost:8080/evit?id=106,将数据从缓存中移除,访问结果如下:

 

这个时候查看控制台,已经提示缓存移除掉了:

 

同时数据也从数据库删除掉了,这个时候如果还需要该数据则需要我们继续向表中添加数据。

缓存技术切换

Spring Boot默认情况下使用ConcurrentMapCacheManager作为缓存技术,有的时候你可能想替换为其他的缓存方式,在Spring Boot中进行缓存的切换非常简单,我这里以Google提供的Guava为例,如果要使用这种缓存策略,只需要添加相应的依赖即可,如下:

<dependency>
 <groupId>com.google.guava</groupId>
 <artifactId>guava</artifactId>
 <version>20.0</version>
</dependency>

就这样就可以了。实际上在Spring Boot中,底层使用哪一种缓存我们并不必做过多考虑,切换的方式也很简单,如上文引入相应的依赖即可,我们只需要把上层的逻辑写好即可。

本文案例下载:

本文GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test25-Cache.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # boot  # 缓存  # 数据缓存  # Spring Boot Web 静态文件缓存处理的方法  # spring boot+spring cache实现两级缓存(redis+caffeine)  # Spring Boot 中使用cache缓存的方法  # SpringBoot项目中使用redis缓存的方法步骤  # 实例详解Spring Boot实战之Redis缓存登录验证码  # Spring Boot缓存实战 EhCache示例  # Spring Boot 基于注解的 Redis 缓存使用详解  # 详解Spring Boot使用redis实现数据缓存  # Spring Boot集成Redis实现缓存机制(从零开始学Spring Boot)  # 在Spring Boot中实现HTTP缓存的方法  # 这个时候  # 器中  # 掉了  # 中了  # 移除  # 的是  # 我说  # 就是因为  # 最好的  # 已被  # 只需  # 我这  # 给我们  # 要把  # 也很  # 这条  # 这一切  # 要我  # 看我  # 就可 


相关文章: 如何快速搭建高效WAP手机网站吸引移动用户?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  建站主机选虚拟主机还是云服务器更好?  如何通过主机屋免费建站教程十分钟搭建网站?  如何快速搭建FTP站点实现文件共享?  如何在宝塔面板中创建新站点?  Bpmn 2.0的XML文件怎么画流程图  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何在香港服务器上快速搭建免备案网站?  如何通过IIS搭建网站并配置访问权限?  建站主机服务器选购指南:轻量应用与VPS配置解析  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  如何快速搭建高效可靠的建站解决方案?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  临沂网站制作公司有哪些,临沂第四中学官网?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何通过WDCP绑定主域名及创建子域名站点?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  高端网站建设与定制开发一站式解决方案 中企动力  如何快速配置高效服务器建站软件?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  如何通过智能用户系统一键生成高效建站方案?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  c# Task.ConfigureAwait(true) 在什么场景下是必须的  网站制作壁纸教程视频,电脑壁纸网站?  建站之星如何修改网站生成路径?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Android自定义listview布局实现上拉加载下拉刷新功能  高性价比服务器租赁——企业级配置与24小时运维服务  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  建站之星ASP如何实现CMS高效搭建与安全管理?  b2c电商网站制作流程,b2c水平综合的电商平台?  建站之星代理商如何保障技术支持与售后服务?  中山网站制作网页,中山新生登记系统登记流程?  如何通过二级域名建站提升品牌影响力?  如何在阿里云完成域名注册与建站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  建站ABC备案流程中有哪些关键注意事项?  Python文件管理规范_工程实践说明【指导】  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何在IIS中新建站点并配置端口与IP地址?  常州企业网站制作公司,全国继续教育网怎么登录?  如何快速搭建自助建站会员专属系统?  网站网页制作专业公司,怎样制作自己的网页?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。