服务器之家

服务器之家 > 正文

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

时间:2020-09-11 10:37     来源/作者:_江南一点雨

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

创建project并添加数据库驱动

spring boot的创建方式还是和我们前文提到的创建方式一样,不同的是这里选择添加的依赖不同,这里我们添加web、cache和jpa依赖,如下图:

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

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

?
1
2
3
4
5
<dependency>
  <groupid>mysql</groupid>
  <artifactid>mysql-connector-java</artifactid>
  <version>5.1.40</version>
 </dependency>

配置application.properties

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

?
1
2
3
4
5
6
7
8
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

创建实体类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@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

?
1
public interface personrepository extends jparepository<person,long> {}

创建业务类

业务接口

?
1
2
3
4
5
6
7
public interface demoservice {
 public person save(person person);
 
 public void remove(long id);
 
 public person findone(person person);
}

实现类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
@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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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,我们有三个地址要测试,一个一个来。当然,在 测试之前,我们先来看看初始状态下的数据库是什么样子的:

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

首先我们在浏览器中访问,得到如下访问结果:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

缓存技术切换

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

?
1
2
3
4
5
<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.

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

原文链接:http://blog.csdn.net/u012702547/article/details/54142243

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
最新idea2020注册码永久激活(激活到2100年)
最新idea2020注册码永久激活(激活到2100年) 2020-07-29
返回顶部