SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.1 缓存的作用
创始人
2024-02-02 21:43:03

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. 自定义缓存

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...