前言
大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫
适合人群
- 学完Java基础
- 想通过Java快速构建web应用程序
- 想学习或了解SpringBoot
大佬可以绕过 ~
背景
本节给大家讲讲 Java的SpringBoot框架, 之前我们学习的都是java的基础知识和底层提供的一些能力,我们日常工作都是在写接口。在我们在产品开发中,一般我们都会选择比较稳定的框架来帮我们加速开发,不会自己去造轮子,而在java众多框架中,spring框架表现的非常好,大部分公司都会首选它作为开发框架,而至今,大部分企业都是以springboot
来构建项目了,一个稳健的系统需要引入稳定的技术~
情景回顾
如果你是一路看过来的,很高兴你能够耐心看完。前几期都是带大家学习了SpringBoot
的基础使用以及集成mybatis
开发,这也是我们写业务的基础,如果你还不熟悉这些,请先看完它们。接下来的几期内容将会带大家进阶使用,会先讲解基础中间件
的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获
,本期将会给大家讲解最热门的缓存中间件技术Redis
,同样的,我们集成到Springboot
中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码
项目源码(持续更新⭐️)
什么是Redis❓
Redis
是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。全称叫Remote Dictionary Server(远程数据服务)
是由C语言
编写的,Redis是一个key-value
存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash
。
它本质上是一种键值对数据库,我们之前学习的mysql
它是持久层的关系型数据库,而redis
它的存储主要存在内存
中。我们都知道在内存
中的数据读取是非常快的,就好比你把一个变量存到磁盘读取和直接放到代码中运行,肯定是在代码中拿到的速度快,因为运行时期,都是直接存到内存的。
特点
给大家总结一下:
- Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s
- Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置,正因为这样,Redis才能实现持久化
- Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。
环境搭建
有了基本的概念之后,我们下面进行环境搭建,在学习阶段,安装redis
很简单,生产环境一般我们也会选择云产品,一切为了服务保障,虽说它只是做缓存用,但也是系统的一把保护伞
如果你是mac
用户,你可以运行如下命令:
brew install redis 复制代码
安装完成后会提示你运行命令,运行即可。
win
用户也很简单,直接下载redis
软件,双击运行即可,运行之后它会有一个小方块的图案,和locahost:6379
的log,说明运行成功了。初始阶段没有配置的redis
默认host
就是本地,port
就是6379
, 而且是没有密码
就可以访问的。
推荐一个客户端软件Redis Desktop Manager
,它是redis
的客户端界面软件,方便面我们学习的时候清理缓存
使用,生产慎连。
Springboot集成Redis
我们不给大家讲它的基本命令使用,它也有语法,可以通过类似命令执行,如果想学习的小伙伴,可以自行搜索。本期重点内容是在sprinboot
中的使用,我们平时开发不可能是去命令行里敲的,都是代码里执行,而目前市面上有很多封装好的库,我们可以直接调用它的方法,很方便的就可以操作它了,不用记一些繁琐的命令,下面我们就实际操作一下:
修改pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 复制代码
修改 application.yml
:
spring: redis: host: localhost # Redis服务器地址 database: 1 # Redis数据库索引(默认为0) port: 6379 # Redis服务器连接端口 password: # Redis服务器连接密码(默认为空) 复制代码
redis
默认是有16
个库,不是15
个啊,从0
开始算的,我们随便连一个
实战
缓存数据
@RequestMapping("/redis") @RestController public class RedisController { @Autowired private StringRedisTemplate stringRedisTemplate; @GetMapping("/set") public String setData() { String key = "data"; stringRedisTemplate.opsForValue().set(key, "dataVal1"); return "success"; } } 复制代码
通过代码很好理解, 首先需要引入StringRedisTemplate
,然后需要设置一个key
,那么思考一下,这个key
允许重复吗❓
修改缓存
@RequestMapping("/redis") @RestController public class RedisController { @Autowired private StringRedisTemplate stringRedisTemplate; @GetMapping("/set") public String setData() { String key = "data"; stringRedisTemplate.opsForValue().set(key, "dataVal2"); return "success"; } } 复制代码
我们进客户端看一下,发现key
还是只有一个,但是值变成了新的值了,所以可以得知key
是唯一的,我们重新设置的时候相当于刷新了它。
删除缓存
在redis
中删除缓存有两种方式,一种是自我消亡,也就是过期
销毁,还有有一种是主动
销毁,我们先看一下,过期时间如何设置
@GetMapping("/expire") public String expireData() { String key = "data"; if(!stringRedisTemplate.expire(key, 10, TimeUnit.SECONDS)) { return "fail"; } return "success"; } 复制代码
我们设置了10s
后过期,过完10s后发现,这个```key data``消失了。我们在看看如何主动删除
@GetMapping("/del") public String deleteData() { String key = "data"; stringRedisTemplate.delete(key); return "success"; } 复制代码
计数器
我们可以利用Redis
做一个计数器,实现自增功能,你可以用它做网站访问统计
@GetMapping("/increment") public Long incrementData() { String key = "data"; return stringRedisTemplate.opsForValue().increment(key,1); } 复制代码
封装成小工具吧
通常做法,我们会把它封装一下,后续使用直接引入封装好的即可,把它直接交给Springboot容器
管理
@Component public class RedisUtil { @Autowired private StringRedisTemplate stringRedisTemplate; public void set(String key, String value) { stringRedisTemplate.opsForValue().set(key, value); } public String get(String key) { return stringRedisTemplate.opsForValue().get(key); } public boolean expire(String key, long expire) { return stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS); } public void remove(String key) { stringRedisTemplate.delete(key); } public Long increment(String key, long delta) { return stringRedisTemplate.opsForValue().increment(key,delta); } } 复制代码
其实这个类,你还可以继续进一步封装,比如约束key
的规范,约束过期时间,约束数据类型等等,这一切也都是为了规范和后期维护,防止滥用缓存
使用场景
缓存的主要场景是用于解决热点数据问题,因为这些数据是访问频率比较高的,当大量的请求进来,mysql
可能压力很大,这样一来,数据查询效率就很慢,用户肯不高兴等了,这样用户体验很不好。所以我们一般做法,都是把这些热点数据放到缓存里,因为缓存读取速度很快。当有新数据的时候,我们再及时更新它,一般流程是先查询缓存,查到了直接返回缓存数据,查不到再走数据库,然后再刷回缓存。
但是并发足够大的时候,还是会暴露出很多问题,比如面试常问的一些高频问题缓存雪崩、缓存穿透、缓存雪崩
,这些问题后边会给大家专门讲,和如何去防范。所以总的来说,引入任何一门技术并不是万事大吉,还需我们不断的在实践中积累经验
结束语
本期到这里就结束了,总结一下,我们了解了什么是redis
,以及在springboot
中如何去使用它们,很简单,没什么复杂的东西。但这里想多说一点的是,缓存的设计却是很复杂的,因为工具是死的,人是活的,我们如何正确设计,需要我们在项目中不断的积累。
下期预告
我们之前教大家查询列表数据,都是所有数据返回,还没有教大家如何去做分页,下期将带大家学习一下mybatis
分页插件的使用 ,下期不见不散, 关注我,不迷路~