• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 在Spring Boot中如何使用数据缓存

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

作者:_江南一点雨 字体:[增加 减小] 来源:互联网 时间:2017-05-28

_江南一点雨 通过本文主要向大家介绍了spring boot 缓存,spring boot使用,spring boot怎么使用,spring boot教程,spring boot等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在实际开发中,对于要反复读写的数据,最好的处理方式是将之在内存中缓存一份,频繁的数据库访问会造成程序效率低下,同时内存的读写速度本身就要强于硬盘。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>
</div>

配置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
</div>

创建实体类

@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;
 }
}

</div>

创建实体类的Repository

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

创建业务类

业务接口

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

 public void remove(Long id);

 public Person findOne(Person person);
}
</div>

实现类

@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;
 }
}

</div>

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

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";
 }
}

</div>

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为例,如果要使用这种缓存策略,只需要添加相应的依赖即可,如下:

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Spring Boot 基于注解的 Redis 缓存使用详解
  • 在Spring Boot中如何使用数据缓存
  • Spring Boot 基于注解的 Redis 缓存使用详解
  • 在Spring Boot中如何使用数据缓存

相关文章

  • 2017-05-28Java递归算法详解(动力节点整理)
  • 2017-05-28Java中实现多线程关键词整理(总结)
  • 2017-05-28SWT(JFace)体验之FillLayout布局
  • 2017-05-28Spring中BeanFactory解析bean详解
  • 2017-05-28Java数据结构之图(动力节点Java学院整理)
  • 2017-05-28Java实现MD5消息摘要算法
  • 2017-05-28java实现二叉树的创建及5种遍历方法(总结)
  • 2017-05-28Java HelloWorld原理分析_动力节点Java学院整理
  • 2017-05-28Java 条件控制与循环控制实例
  • 2017-05-28Spring MVC 4.1.3 + MyBatis零基础搭建Web开发框架(注解模式)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 实例解析Java设计模式编程中的适配器模式使用
    • Java多态(动力节点Java学院整理)
    • Java中finalize()详解及用法
    • Spring boot将配置属性注入到bean类中
    • mybatis教程之查询缓存(一级缓存二级缓存和整合ehcache)
    • Spring Boot(五)之跨域、自定义查询及分页
    • java 算法二分查找和折半查找
    • 详解Spring Boot中Controller用法
    • Java中多线程同步类 CountDownLatch
    • Java中LinkedList详解和使用示例_动力节点Java学院整理

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有