SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.1 缓存的作用
创始人
2024-02-02 19:54:45
0

SpringBoot

【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

SpringBoot 开发实用篇

文章目录

      • SpringBoot
      • SpringBoot 开发实用篇
      • 5 整合第三方技术
        • 5.1 缓存的作用
          • 5.1.1 缓存介绍
          • 5.1.2 小结

5 整合第三方技术

5.1 缓存的作用

5.1.1 缓存介绍

在这里插入图片描述

现在我们的应用,不管是APP还是网页,都是从数据库中取存数据使用

如果长期的对数据库进行访问,这样数据库的压力会越来越大【这样数据库就会成为整个系统的操作瓶颈】

其实这么大的访问量中,可能会有【或许说一定会有】相同的操作

能不能有一块儿空间,里面存下经常访问的数据,APP去访问它,它去访问数据库

【这样就可以有效降低数据库的压力】

这一块空间,我们把它称为缓存 cache

所以定义:

  • 缓存是一种介于数据永久存储介质【比如数据库】与数据应用【APP、网页】之间的数据临时存储介质
  • 使用缓存可以有效的减少低速数据读取过程的次数(例如磁盘IO),提高系统性能
  • 缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间

我们来快速的模拟一个缓存,体验感受一下

创建一个新的工程模块

在这里插入图片描述

在这里插入图片描述

依赖都不勾,自己加

直接创建

在这里插入图片描述

一个全新的 SpringBoot 项目

【导坐标】

org.springframework.bootspring-boot-starter-web
org.projectlomboklombok
com.baomidoumybatis-plus-boot-starter3.5.2
com.alibabadruid-spring-boot-starter1.2.11
mysqlmysql-connector-javaruntime

注意是web 起步

在这里插入图片描述

【配置】

server:port: 80spring:datasource:druid:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTCusername: rootpassword: 200039mybatis-plus:global-config:db-config:table-prefix: tbl_id-type: autoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

【实体类】

package com.dingjiaxiong.domain;import lombok.Data;/*** ClassName: Book* date: 2022/10/20 21:29** @author DingJiaxiong*/@Data
public class Book {private Integer id;private String type;private String name;private String description;}

【dao】

package com.dingjiaxiong.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dingjiaxiong.domain.Book;
import org.apache.ibatis.annotations.Mapper;/*** ClassName: BookDao* date: 2022/10/20 21:29** @author DingJiaxiong*/@Mapper
public interface BookDao extends BaseMapper {
}

【service】

package com.dingjiaxiong.service;import com.dingjiaxiong.domain.Book;import java.util.List;/*** ClassName: BookService* date: 2022/10/20 21:31** @author DingJiaxiong*/public interface BookService {public boolean save(Book book);public Book getById(Integer id);public boolean update(Book book);public boolean delete(Integer id);public List getAll();}

【实现类】

package com.dingjiaxiong.service.impl;import com.dingjiaxiong.dao.BookDao;
import com.dingjiaxiong.domain.Book;
import com.dingjiaxiong.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** ClassName: BookServiceImpl* date: 2022/10/20 21:32** @author DingJiaxiong*/@Service
public class BookServiceImpl implements BookService {@Autowiredprivate BookDao bookDao;@Overridepublic boolean save(Book book) {return bookDao.insert(book) > 0;}@Overridepublic Book getById(Integer id) {return bookDao.selectById(id);}@Overridepublic boolean update(Book book) {return bookDao.updateById(book) > 0;}@Overridepublic boolean delete(Integer id) {return bookDao.deleteById(id) > 0;}@Overridepublic List getAll() {return bookDao.selectList(null);}
}

【控制器】

package com.dingjiaxiong.controller;import com.dingjiaxiong.domain.Book;
import com.dingjiaxiong.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** ClassName: BookController* date: 2022/10/20 21:35** @author DingJiaxiong*/@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate BookService bookService;@GetMapping("{id}")public Book get(@PathVariable Integer id){return bookService.getById(id);}@PostMappingpublic boolean save(@RequestBody Book book){return bookService.save(book);}@PutMappingpublic boolean update(@RequestBody Book book){return bookService.update(book);}@DeleteMapping("{id}")public boolean delete(@RequestBody Book book){return bookService.save(book);}@GetMappingpublic List getAll(){return bookService.getAll();}}

OK,启动服务器,直接在postman 中测试一下

在这里插入图片描述

在这里插入图片描述

OK,能用

现在的问题是,每执行一次查询

在这里插入图片描述

它都会在数据库那边执行一个对应的操作

比如我在点一次send

在这里插入图片描述

这就又做了一次【这样就会给数据库带来很大的压力,因为就算是相同的数据,也要去查询很多次】

【这个问题可以解决吗?】

我们快速做一下

进入业务层

private HashMap cache = new HashMap(); //现在这个集合就是我们的缓存了@Override
public Book getById(Integer id) {//如果当前缓存中没有本次要查询的数据,则调用数据层进行查询,//否则直接从缓存中获取数据返回Book book = cache.get(id);//如果是空,那就调数据层进行查询,并存入集合if (book == null) {Book queryBook = bookDao.selectById(id);//放入缓存集合cache.put(id,queryBook);return queryBook;}//如果不是空,那就直接从缓存中返回对应数据return cache.get(id);
}

在这里插入图片描述

重启服务器

在这里插入图片描述

先来一次查询

在这里插入图片描述

第一次,要调用数据层

再来一次

在这里插入图片描述

OK,不管来多少次,都不会再去调用数据层访问数据库了,这个数据已经在内存的集合里面了

当然这个缓存一直在我们的内存里面,万一内存炸了,所以还要考虑清空缓存的问题

【这就是缓存的一个简单模拟】

甚至于我们可以把缓存拆成两个缓存

在这里插入图片描述

这就是多级缓存的设计结构

而且缓存还可以存储一些其他的外部数据

在这里插入图片描述

这些数据不用进数据库,但是我们有必要把它存起来【比如手机验证码就是一个临时数据】

我们也可以模拟一下

做一个service

package com.dingjiaxiong.service;/*** ClassName: MsgService* date: 2022/10/20 21:54** @author DingJiaxiong*/public interface MsgService {public String get(String tele); //电话号码public boolean check(String tele, String code); //电话号码和验证码比对验证}

实现类

package com.dingjiaxiong.service.impl;import com.dingjiaxiong.service.MsgService;
import org.springframework.stereotype.Service;import javax.lang.model.element.NestingKind;
import java.util.HashMap;/*** ClassName: MsgServiceImpl* date: 2022/10/20 21:55** @author DingJiaxiong*/@Service
public class MsgServiceImpl implements MsgService {//定义一个缓存private HashMap cache = new HashMap();@Overridepublic String get(String tele) {  //生成验证码//拿给的电话的后六位作为验证码String code = tele.substring(tele.length() - 6);//把生成的验证码放入缓存cache.put(tele, code);return code;}//验证的时候,就拿传过来的电话号码,去和缓存中的验证码进行比对@Overridepublic boolean check(String tele, String code) {String querycode = cache.get(tele);return code.equals(querycode);}
}

复制一个controller【改一下】

package com.dingjiaxiong.controller;import com.dingjiaxiong.domain.Book;
import com.dingjiaxiong.service.BookService;
import com.dingjiaxiong.service.MsgService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** ClassName: BookController* date: 2022/10/20 21:35** @author DingJiaxiong*/@RestController
@RequestMapping("/msg")
public class MsgController {@Autowiredprivate MsgService msgService;//发送验证码@GetMapping("{tele}")public String get(@PathVariable String tele){return msgService.get(tele);}//校验@PostMappingpublic boolean check(String tele , String code){return msgService.check(tele,code);}}

OK,直接启动服务器

在这里插入图片描述

在postman 中进行测试

在这里插入图片描述

后六位被返回来作为验证码

进行校验

在这里插入图片描述

OK,没毛病

这个栗子就是表明

在这里插入图片描述

这个缓存的东西并不是我数据库里面的东西

【所以说:缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间】

5.1.2 小结
  1. 缓存作用
  2. 自定义缓存

相关内容

热门资讯

开学第一周作文 开学第一周作文(通用56篇)  在平时的学习、工作或生活中,大家都不可避免地要接触到作文吧,作文是由...
我的特长作文500字 我的特长作文500字(通用75篇)  在日常学习、工作抑或是生活中,大家都跟作文打过交道吧,作文根据...
寻梦作文 寻梦作文寻梦有人说:“梦想,你在哪?快出来吧。”从古至今,有无数人被困难束缚,丢弃了梦想,选择了放弃...
感悟亲情作文 感悟亲情作文600字(通用30篇)  无论是在学校还是在社会中,大家都不可避免地要接触到作文吧,作文...
好朋友作文500字 【必备】好朋友作文500字3篇  在学习、工作、生活中,说到作文,大家肯定都不陌生吧,作文可分为小学...
温度作文600字 【精品】温度作文600字(通用20篇)  在生活、工作和学习中,大家都接触过作文吧,写作文可以锻炼我...
感动文作文500字 【精选】感动文作文500字合集五篇  在日复一日的学习、工作或生活中,大家都尝试过写作文吧,作文是由...
母亲的爱作文500字 母亲的爱作文500字(精选21篇)  妈妈,你的爱像春天的燕子为我衔来醉人的春意,你的爱像汩汩的留水...
礼貌作文600字 关于礼貌作文600字(精选30篇)  在日常生活或是工作学习中,大家都不可避免地要接触到作文吧,作文...
美在我身边作文400字 美在我身边作文400字(通用5篇)  在日常学习、工作或生活中,大家或多或少都会接触过作文吧,根据写...
评价诸葛亮作文 评价诸葛亮作文范文(精选8篇)  诸葛亮自古以来就一直受到人们的广泛评论,深受人们的爱戴,他的聪明才...
泥土礼赞优秀作文 泥土礼赞优秀作文  在日常学习、工作抑或是生活中,大家都接触过作文吧,借助作文人们可以反映客观事物、...
我懂得了作文 我懂得了作文(通用10篇)  无论是在学校还是在社会中,大家都写过作文,肯定对各类作文都很熟悉吧,作...
中国的世界文化遗产作文500... 中国的世界文化遗产作文500字精选10篇  在学习、工作乃至生活中,说到作文,大家肯定都不陌生吧,作...
作文 青春心语 作文 青春心语  夏末,还是那么的炎热,太阳高高的挂在那上面,一动也不动。大街上还是人来人往,丝毫没...
我欣赏作文 有关我欣赏作文八篇  在平平淡淡的日常中,大家最不陌生的就是作文了吧,作文要求篇章结构完整,一定要避...
地震后的感想作文 地震后的感想作文(精选6篇)  在日常学习、工作抑或是生活中,大家总少不了接触作文吧,作文根据体裁的...
写辣椒的作文300字 写辣椒的作文300字(精选20篇)  在日常的学习、工作、生活中,大家都有写作文的经历,对作文很是熟...
离别的作文 离别的作文(通用35篇)  我们匆匆地告别,走向各自的远方,没有语言,更没有眼泪,只有永恒的思念和祝...
敬业作文800字 敬业作文800字(通用28篇)  在日常学习、工作抑或是生活中,大家或多或少都会接触过作文吧,作文根...