Spring Boot学习(缓存-Redis)

来源:互联网 发布:苹果电脑录屏软件 编辑:程序博客网 时间:2024/06/03 22:40

终于回家了,这几天一直在路上,所以没有写博客,明天开始找工作了,今晚来一篇缓存的介绍

1.缓存(介绍一些概念,不影响后面的代码,可跳过)

1.1 什么是缓存

(来自百度百科)
  缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。
  L1 Cache(一级缓存)是CPU第一层高速缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存储器均由静态RAM组成,结构较复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般L1缓存的容量通常在32—256KB。
  L2 Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片。内部的芯片二级缓存运行速率与主频相同,而外部的二级缓存则只有主频的一半。 L2高速缓存容量也会影响CPU的性能,原则是越大越好,普通台式机CPU的L2缓存一般为128KB到2MB或者更高,笔记本、服务器和工作站上用CPU的L2高速缓存最高可达1MB-3MB。

  简单的说就是,计算机的数据通过磁盘读取等流程,最后经过CPU的处理后得到,这也是为什么认为CPU是离数据最近的地方。我们的程序都是需要数据做支撑的,而数据同一存储在磁盘中(持久化),当需要某个数据时,我们先发起查找指令,然后通过磁盘查找,CPU处理再传回客户端。在传输过程中的时间消耗在并发过大后会产生线程等待、阻塞等,而在磁盘查找过程中,当数据量越来越大后他查找的速度也会越来越慢,这时就考虑把数据放到“更近的地方”,这个地方成为缓存区,这个行为我们成为缓存。

1.2 缓存主要的三个作用

  预读取
当硬盘受到CPU指令控制开始读取数据时,硬盘上的控制芯片会控制磁头把正在读取的簇的下一个或者几个簇中的数据读到缓存中(由于硬盘上数据存储时是比较连续的,所以读取命中率较高),当需要读取下一个或者几个簇中的数据的时候,硬盘则不需要再次读取数据,直接把缓存中的数据传输到内存中就可以了,由于缓存的速率远远高于磁头读写的速率,所以能够达到明显改善性能的目的
  写入
当硬盘接到写入数据的指令之后,并不会马上将数据写入到盘片上,而是显示存储在缓存里,然后发送一个“数据已写入”的信号给系统,这时系统就会认为数据已经写入,并继续执行下面的工作,而硬盘则在空闲(不进行读取或写入的时候)时再将缓存中的数据写入到盘片上。虽然对于写入数据的性能有一定提升,但也不可避免地带来了安全隐患——数据还在缓存里的时候突然掉电,那么这些数据就会丢失。对于这个问题,硬盘厂商们自然也有解决办法:掉电时,磁头会借助惯性将缓存中的数据写入零磁道以外的暂存区域,等到下次启动时再将这些数据写入目的地
  临时存储
有时候,某些数据是会经常需要访问的,像硬盘内部的缓存(暂存器的一种)会将读取比较频繁的一些数据存储在缓存中,再次读取时就可以直接从缓存中直接传输。缓存就像是一台计算机的内存一样,在硬盘读写数据时,负责数据的存储、寄放等功能。这样一来,不仅可以大大减少数据读写的时间以提高硬盘的使用效率。同时利用缓存还可以让硬盘减少频繁的读写,让硬盘更加安静,更加省电。更大的硬盘缓存,你将读取游戏时更快,拷贝文件时候更快,在系统启动中更为领先。

1.3 如何实现缓存

  通过上面的介绍,我们可以把缓存区看成一个高速读写区,那么如何实现缓存就需要知道整个web流程中都有哪些。
这里写图片描述
  那么我将缓存分为两种,一个是客户端的浏览器缓存,还有一个是服务端的查询结果缓存。有些数据是只用来读取的,比如说字典表中的数据,自定义的HTTP代码等,这些在软件设计实现开始运营后,基本是不会再改了,而某些需要大量使用的时候,我们不妨把这些数据放在浏览器中,在工作过程中我有使用过localstorage,是H5的前端存储,比较简单。而在客户端我们可以使用内存数据库(Redis),或者是进程内缓存框架(ECache)等,他们都提供了一种高速的读写能力。

2.Spring Boot+Cache+Redis

  这里使用之前的unit2-1的项目作为基本项目,进行添加。
  先在pom.xml中加入缓存依赖和Redis链接依赖

    <!-- Redis -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-redis</artifactId>        </dependency>        <!-- Cache -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-cache</artifactId>        </dependency>

添加Redis配置信息

# Redis配置# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=localhost# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0

然后再启动类上增加启动缓存的注解@EnableCaching(应该添加一个Redis缓存配置类,这里偷懒直接用启动类了,如果你看到这句话,说明我这篇博客还没写完。。。我之后会添加上配置类)

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

然后在Service上添加缓存注解@CacheConfig,@Cacheable,@CacheEvict注解实现缓存功能。
最后启动项目,访问缓存数据的接口,第一次的时候会在控制台打印SQL而之后就不会再打印了(我只测试了@Cacheable一个注解)

项目传到git上了unit3-1,大家可以打开看看。

原创粉丝点击