Springboot与Mybatis后再与Redis整合
文章转自http://blog.csdn.net/acmman/article/details/53167917
(1)持久化数据库的缺点
平常我们使用的关系型数据库有Mysql、Oracle以及SqlServer等,在开发的过程中,操作数据通常都是通过提供的数据库驱动来连接数据库进行增删改查。
那么,我们日常使用的数据库的数据都储存在哪里呢?我们以Mysql为例。打开我们Mysql所在的文件夹目录下的data文件夹,如下所示:
我们可以发现,里面都是我们创建的数据库,打开其中一个,可以看到我们创建的表,他们以文件(格式frm和ibd)的形式存在:
也就是说,我们日常使用的关系型数据中的数据,全部存储在我们部署数据库的机器的硬盘中。
一般我们的网站开发完成,上线之后,服务器的读写效率是网站运行速度的重要条件,当然还有服务器的带宽等,但是这些东西都可以通过硬件的更新升级来解决。其实与网站运行效率息息相关的东西,就是我们的------数据库。
数据库处理数据的速度,与网站速度息息相关,而数据查询、数据处理等等,都和数据库处理速度有关。提高数据库的处理数据的能力,其中一个方案就是sql语句的优化技术,sql语句写的处理效率比较高,数据库处理能力就会上去,而网站的数据处理能力也会快些。
但是,当网站的处理和访问量非常大的时候,我们的数据库的压力就变大了,数据库的连接池,数据库同时处理数据的能力就会受到很大的挑战,一旦数据库承受了其最大承受能力,网站的数据处理效率就会大打折扣。此时就要使用高并发处理、负载均衡和分布式数据库,而这些技术既花费人力,又花费资金。
如果我们的网站不是非常大的网站,而有想要提高网站的效率,降低数据库的读写次数,我们就需要引入缓存技术。
(2)缓存
缓存就是在内存中存储的数据备份,当数据没有发生本质改变的时候,我们就不让请求查询操作去数据库进行查询,而去内存中取数据,这样就大大降低了数据库的读写次数,而且从内存中读数据的速度比去数据库查询要快很多,这样同时又提高了效率。
使用缓存减轻数据库的负载:
在开发网站的时候如果有一些数据在短时间之内不会发生变化,而它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,就把这些数据放到一个读取速度更快的介质上(或者是通过较少的计算量就可以获得该数据),该行为就称作对该数据的缓存。该介质可以是文件/数据库/内存。内存经常用于数据库缓存。
缓存的两种形式:
页面缓存经常用在CMS(content manage system)内存管理系统里面。数据缓存经常会用在页面的具体数据里面。
页面缓存(smarty静态化技术):页面缓存,第一次从数据库读取,然后生成一个静态页面,以后所有的读取,只加载这个静态页面就可以了,这就是页面缓存。
数据缓存:在日常开发有这样的一种场景:某些数据的数据量不大、不经常变动,但访问却很频繁。受限于硬盘 IO 性能或者远程网络等原因,每次都直接获取会消耗大量的资源。可能会导致我们的响应变慢甚至造成系统压力过大,这在一些业务上是不能忍的,这时候我们可以通过数据缓存,将数据存到Redis数据库中进行缓存,请求查询时,首先查询Redis数据库中是否有数据库,有则直接返回,没有的话,请求就会访问数据库从数据库中将数据取出。
Redis缓存技术
Redis是Remote Dictionary Server(远程数据服务)的缩写,由意大利人antirez (Salvatore Sanfilippo)开发的一款内存高速缓存数据库,该软件使用C语言编写,它的数据模型为key-value。它支持丰富的数据结构(类型),比如String/List/Hash/Set/Sorted Set
可持久化(一边运行,一边把数据往硬盘中备份一份,防止断电等情况导致数据丢失,等断电情况恢复之后,Redis再把硬盘中的数据恢复到内存中),保证了数据的安全。
Redis的安装与启动运行:
Redis数据库的安装以及Redis的可视化工具的安装可以自行百度进行完成。可参考安装教程
http://www.runoob.com/redis/redis-install.html
需要了解的是Redis的使用,在安装路径D:\DataBases\Redis-x64-3.2.100
1.在 C:\Windows\System32\cmd.exe 进入cmd
2.复制redis-server.exe redis.windows.conf回车启动redis
SpringBoot+Mybatis+Redis的整合
整合需要的引入的依赖如下:
SpringBoot与Mybatis的整合可参考之前我写的,这里就不在展示SpringBoot的整合过程了,直接在SpringBoot与Mybatis整合的基础上进行Redis的整合。SpringBoot整合Mybatis
<dependencies>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--redis的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
SpringBooot集成Redis很简单,在pom.xml中配置相关的jar依赖。
<!--redis的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在SpringBoot核心配置文件application.properties中配置redis连接信息:
# mybatis
mybatis.type-aliases-package=com.jiuyue.model
mybatis.mapper-locations=classpath:com/jiuyue/mapper/*.xml
#datasource
spring.datasource.url=jdbc:mysql://localhost:3306/springdb?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1111
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
配置上面的依赖以及redis连接信息,SpringBoot将自动配置RedisTemplate,在需要操作redis的类中注入 redisTemplate就可以使用了。
public class StudentController {
/*注入StudentService*/
@Autowired
private StudentService studentService;
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
@GetMapping(value = "/getStudents")
@ResponseBody
public Object getStudents(){
/*先从redis 缓存中查询*/
List<Student> studentList = (List<Student>) redisTemplate.opsForValue().get("students");
if (studentList==null){
/*从mysql数据库中查询*/
studentList = studentService.getStudents();
/*保存到redis数据库*/
redisTemplate.opsForValue().set("students",studentList);
}
return studentList;
}
}
当第一次请求查询全部学生信息的时候,首先查询Redis,Redis中没有数据,则请求查询到Mysql数据库进行查询取数据,并把查询的数据存储到Redis数据库中进行进行缓存,等下次若有请求查询查询全部学生信息的时候,首先查询缓存,可以在缓存中查询,直接返回数据。
从mysql数据库查询。----ServiceImpl
2019-03-01 11:23:36.912 INFO 14328 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2019-03-01 11:23:37.047 INFO 14328 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
保存到redis中的数据。
我们可以看到在redi中存放数据的key是序列化的,可读性并不是很好。
可以在项目开发的时候操作Redis的序列化方式改一下
/*redis的序列化器*/
RedisSerializer redisSerializer = new StringRedisSerializer();
/*设置redisTemplate序列化器*/
redisTemplate.setKeySerializer(redisSerializer);
@Controller
public class StudentController {
/*注入StudentService*/
@Autowired
private StudentService studentService;
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
@GetMapping(value = "/getStudents")
@ResponseBody
public Object getStudents(){
/*redis的序列化器*/
RedisSerializer redisSerializer = new StringRedisSerializer();
/*设置redisTemplate序列化器*/
redisTemplate.setKeySerializer(redisSerializer);
/*先从redis 缓存中查询*/
List<Student> studentList = (List<Student>) redisTemplate.opsForValue().get("students");
if (studentList==null){
/*从mysql数据库中查询*/
studentList = studentService.getStudents();
/*保存到redis数据库*/
redisTemplate.opsForValue().set("students",studentList);
}
return studentList;
}
}