SpringBoot 缓存

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述

目录

  • 一、缓存的作用
  • 二、SpringBoot启用缓存
  • 三、SpringBoot可整合的缓存技术
  • 四、缓存使用案例——收集验证码
    • 实体类开发
    • 业务层开发
    • 工具类(生成验证码)
    • 控制层开发
    • SpringBoot启动类
    • 测试
  • 五、变更缓存供应商Ehcache


一、缓存的作用



缓存

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




二、SpringBoot启用缓存


SpringBoot提供了缓存技术,方便缓存的使用

  • 启用缓存
  • 设置进入缓存的数据
  • 设置读取缓存的数据

pom.xml导入缓存相关的起步依赖

        <!--缓存功能的起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>

SpringBoot启动类,添加@EnableCaching注解,启用缓存

@SpringBootApplication
@EnableCaching        //此注解表示开启缓存功能
public class Springboot4CacheApplication {public static void main(String[] args) {SpringApplication.run(Springboot4CacheApplication.class, args);}}

业务层组件,使用@Cacheable注解

value属性:存放缓存的位置,可随意定义

key属性:使用 # + 参数名 的方式设置缓存的数据

@Override
@Cacheable(value = "cacheSpace",key = "#id")
public Book getById(Integer id){return bookMapper.selectById(id);
}



三、SpringBoot可整合的缓存技术



  • SpringBoot提供的缓存技术除了提供默认的方案,还可以对其他缓存技术进行整合,统一接口,方便缓存技术的开发与管理。

常见的SpringBoot可整合的缓存技术

  • Generic
  • JCache
  • Ehcache
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffenine
  • Simple(默认)
  • memcached




四、缓存使用案例——收集验证码



需求

  • 输入手机号获取验证码,组织文档以短信形式发送给用户(页面模拟)
  • 输入手机号和验证码以验证结果

需求分析

  • 提供Controller组件,传入手机号,业务层通过手机号计算出独有的6位数验证码数据,存入缓存后返回此数据;
  • 提供Controller组件,传入手机号与验证码,业务层通过手机号从缓存中读取验证码,与输入的验证码进行比对,返回最终结果;

实体类开发


lombok快速开发实体类

        <!--导入lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

import lombok.Data;/*** @author .29.* @create 2023-04-02 22:08* 使用@Data注解,提供Getter、Setter和toString()*/
@Data
public class SMSCode {//电话号码private String phoneNumber;//验证码private String code;
}



业务层开发


业务层接口

/*** @author .29.* @create 2023-04-02 22:12*/public interface SMSCodeService {//模拟向sm卡发送验证码public String sendCodeToSMS(String phoneNumber);//验证验证码是否正确public boolean checkCode(SMSCode smsCode);
}

业务层接口实现类

  • 业务层组件中,使用了缓存功能,缓存功能的开启需要在SpringBoot工程的启动类中使用@EnableCaching开启缓存功能。
/*** @author .29.* @create 2023-04-02 22:15*/
@Service
public class SMSCodeServiceImpl implements SMSCodeService {@Autowiredprivate CodeUtils utils;  //自动装配工具类对象(工具类中提供了生成验证码的算法)@Override//@Cacheable注解不适用,缓存会被读取,导致前后两次验证码重复//@Cacheable(value="smsCode",key = "#phoneNumber")//@CachePut注解,缓存只可放不可读@CachePut(value="smsCode",key = "#phoneNumber")public String sendCodeToSMS(String phoneNumber) {return utils.generator(phoneNumber);}@Overridepublic boolean checkCode(SMSCode smsCode) {//取出内存中的验证码与传递过来的参数比对,如果相同,返回trueString code = smsCode.getCode();String cacheCode = utils.get(smsCode.getPhoneNumber());return cacheCode.equals(code);}
}



工具类(生成验证码)


工具类实现

/*** @author .29.* @create 2023-04-02 22:26*/
@Component
public class CodeUtils {//为不足六位数的验证码补0用private String[] patch = {"000000","00000","0000","000","00","0",""};//加密,生成验证码public String generator(String phoneNumber){//获取手机号的hashCode值int hash = phoneNumber.hashCode();//设置一个加密码int encryption = 20230209;//获取第一次加密结果long result = hash ^ encryption;//第二次加密,第一次加密结果与当前时间进行异或操作long nowTime = System.currentTimeMillis();result = result ^ nowTime;//获取第二次加密结果的后六位long code = result % 1000000;code = code < 0 ? -code : code;//避免验证码为负值//转化为字符串String codeStr = code+"";int len = codeStr.length();return patch[len]+codeStr;}//设置phoneNumber的缓存,方法返回值为null,有缓存则返回缓存数据,没有才返回null@Cacheable(value="smsCode",key = "#phoneNumber")public String get(String phoneNumber){return null;}}


控制层开发


/*** @author .29.* @create 2023-04-02 22:16*/
//用于标记控制器类。@RestController 是 @Controller 和 @ResponseBody 的组合注解,用于标记 RESTful 风格的控制器类。
@RestController
@RequestMapping("/sms")
public class SMSCodeController {@Autowiredprivate SMSCodeService service; //自动装配业务层组件//获取验证码@GetMappingpublic String getCode(String phoneNumber){String code = service.sendCodeToSMS(phoneNumber);return code;}//判断验证码是否正确@PostMappingpublic boolean checkCode(SMSCode smsCode){boolean result = service.checkCode(smsCode);return result;}
}


SpringBoot启动类


  • 注意要开启缓存功能
@SpringBootApplication
@EnableCaching        //此注解表示开启缓存功能
public class Springboot4CacheApplication {public static void main(String[] args) {SpringApplication.run(Springboot4CacheApplication.class, args);}}


测试


运行案例工程

在这里插入图片描述


使用国产postMAN测试功能

  • 使用页面模拟接收验证码:(每次发送请求,验证码都不会重复)

在这里插入图片描述


  • 模拟验证码比对校验:(只有当次手机号码与验证码匹配,才会返回true)

在这里插入图片描述



五、变更缓存供应商Ehcache



pom.xml导入Ehcache依赖

        <dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId></dependency>

application.yml配置文件

  • 设置使用ehcache的缓存
spring:cacahe:type: ehcache

配置Ehcache的xml配置文件

  • 其中的name属性值,需要保证与你注解中设置的缓存位置一致
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"updateCheck="false"><diskStore path="D:\ehcache" /><!--默认缓存策略 --><!-- external:是否永久存在,设置为true则不会被清除,此时与timeout冲突,通常设置为false--><!-- diskPersistent:是否启用磁盘持久化--><!-- maxElementsInMemory:最大缓存数量--><!-- overflowToDisk:超过最大缓存数量是否持久化到磁盘--><!-- timeToIdleSeconds:最大不活动间隔,设置过长缓存容易溢出,设置过短无效果,可用于记录时效性数据,例如验证码--><!-- timeToLiveSeconds:最大存活时间--><!-- memoryStoreEvictionPolicy:缓存清除策略--><defaultCacheeternal="false"diskPersistent="false"maxElementsInMemory="1000"overflowToDisk="false"timeToIdleSeconds="60"timeToLiveSeconds="60"memoryStoreEvictionPolicy="LRU" /><cachename="smsCode"  eternal="false"diskPersistent="false"maxElementsInMemory="1000"overflowToDisk="false"timeToIdleSeconds="10"timeToLiveSeconds="10"memoryStoreEvictionPolicy="LRU" /></ehcache>

  • 完成上述配置,缓存技术也就更换完成了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32单片机通过ST-Link 烧录和调试

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. ST-LINK V2 2. 操作步骤 2.1 连接方式 2.2 驱动安装常规步骤 2.3 Keil中的设置 3. 调式仿真 4. 常见问题排查 1. ST-LINK V2 ST LINK v2下载器用于STM32单片机&#xff0c;可以下载程序、调试…

c++并查集

文章目录 前言一、并查集1、并查集原理2、并查集实现3、并查集应用1.省份数量2.等式方程的可满足性 前言 一、并查集 1、并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后…

机器视觉检测技术是什么?突出的亮点有哪些?

机器视觉检测技术是一种利用图像处理软件分析处理相机捕捉到的图像&#xff0c;以替代人眼在制造和测试过程中进行检测和测量的技术。它广泛应用于工业自动化领域&#xff0c;可以提高生产效率和质量控制的精度。机器视觉系统通常包括光源、相机、图像处理单元和执行机构等组成…

如何链接多个modbus_tcp设备,并将设备数据写入同一个modbusSlave,以便外部客户端获取所有链接设备的数据。

在modbus通信中&#xff0c;一个modbus服务器一次只能链接一个客户机&#xff0c;那么&#xff0c;外部客户端要获取多个设备的modbus数据&#xff0c;就需要使用链接一个专用的mosbus服务器&#xff0c;一下就是详细解决方法。 第一步&#xff1a;创建modbus客户端&#xff0…

组合总数 python

‘’已知—个无重复元素的序列,给定—个目标数,找出序列中所有可以使数字和未目标数的组合。 序列中的元素可以被多次选用,不能出现重复的组合, 序列中的元素和目标数都是正整数。 例如序列 [2, 3, 5]&#xff0c; 目标值为8&#xff0c; 最终的组合有 &#xff08;2, 3, 3&am…

nvm基本使用

nvm基本使用 文章目录 nvm基本使用1.基本介绍2.下载地址3.常用指令 1.基本介绍 NVM是一个用于管理 Node.js 版本的工具。它允许您在同一台计算机上同时安装和管理多个 Node.js 版本&#xff0c;针对于不同的项目可能需要不同版本的 Node.js 运行环境。 NVM 主要功能&#xff…

嵌入式学习——C语言基础——day10

1. 指针的基本概念 1.1 地址 用来区别不同内存字节空间的编号 1.2 指针 地址就是指针&#xff0c;指针就是地址&#xff0c;地址是一个编号&#xff0c;指针多了指向的概念 1.3 指针变量 用来存放指针的变量&#xff0c;有时将指针变量简称为指针 2. 指针相关运算符 & …

24深圳杯AC题完整思路+可执行代码+参考论文!!!!

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的&#xff0c;大家可以参考我往期的资料&#xff0c;所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意&#xff1a;&#xff08;建议先下单占坑&#xff0c;因为随着后续我们更新资料数…

001 rabbitmq减库存demo direct

文章目录 ProducerConsumerRabbitMQDirectConfig.javaapplication.yamlServletInitializer.javaRabbitmqApplication.javapom.xml“该消息已经准备好再次被消费”和“队列已经准备好重新分发该消息” Producer 这段代码定义了一个名为Producer的RESTful Web服务Controller&…

iOS(Object C) 插入排序

插入排序的思想: 可以想象你在打牌,手里有一张牌2, 第一次摸到一张牌5; 5 比1 大,所以摸到的牌5放在1的右边; (此时手里的牌为 2->5) 第二次摸到一张牌3; 3比5小,所以3和5互换位置,再拿3和2比,3比2大,3不动(此时手里的牌为 2-> 3 -> 5) 第三次摸到一张牌1,1比5小,…

Windows10系统安装IIS的步骤

在Windows 10上安装IIS的步骤如下&#xff1a;12 打开控制面板&#xff0c;选择“程序”或“程序和功能”。点击“启用或关闭Windows功能”。在列表中找到“Internet Information Services”&#xff0c;勾选该选项。根据需要勾选IIS的具体组件&#xff0c;如万维网服务、IIS可…

创新指南 | 2024年企业如何十步打造最佳的数字化营销策略组合

营销是一个动态且不断变化的领域。顶级的数字营销策略随着消费者和技术趋势的变化而变化。这就是为什么每个公司都需要一个经过良好规划并具有明确里程碑和目标的营销策略。一旦你有了正确的计划&#xff0c;你实现为业务设定的目标的可能性就会大大增加。这意味着&#xff0c;…

面试经典150题——求根节点到叶节点数字之和

​ 1. 题目描述 2. 题目分析与解析 2.1 思路一——DFS 理解问题&#xff1a; 首先要理解题目的要求&#xff0c;即对于给定的二叉树&#xff0c;我们需要找出从根节点到所有叶子节点的所有路径&#xff0c;然后将每一条路径上的数字组成一个整数&#xff0c;最后求出这些整数…

k8s部署prometheus

部署pvc 修改nfs-deployment.yaml文件中的信息&#xff0c;然后应用YAML文件 cat > /opt/k8s/prometheus/prometheus-pvc.yaml <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata:name: prometheus-data-pvc spec:accessModes:- ReadWriteManystorageClas…

京东天幕,宙斯,云鼎什么关系

京东云鼎是京东云推出的一站式零售应用云计算平台&#xff0c;为商家、品牌商及合作伙伴与京东无界赋能的商业赋能、业务赋能、品牌赋能等服务集成&#xff0c;提供弹性的云计算资源、可靠的安全服务、高效的数据推送服务、标准化的网关服务&#xff0c;并优先享受京东的云端生…

手把手教数据结构与算法:栈的应用(平衡符号和简单计算器)

栈 基本概念 栈的定义 栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&#xff08;Top&#xff09;&#xff1a;线性表允许进行插入删除的那一端…

@Value

Value 注解是 Spring 框架中的一个注解&#xff0c;用于从属性文件、环境变量、Java 系统属性等地方读取值&#xff0c;并将这些值注入到 Spring 管理的 Bean 中。 Component public class MyBean {Value("${my.property}")private String myProperty;// Getter and…

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

debian gnome-desktop GUI(图形用户界面)系统

目录 &#x1f31e;更新 &#x1f3a8;安装 &#x1f34e;分配 &#x1f6cb;️重启 &#x1f511;通过VNC连接 debian gnome-desktop &#x1f31e;更新 sudo apt update sudo apt -y upgrade &#x1f3a8;安装 sudo apt -y install task-gnome-desktop 这个过程比…

前端发版缓存问题

前端发版后浏览器缓存问题 浏览器缓存机制是为了提高网页加载速度和减少带宽消耗而设计的。当浏览器访问一个资源时&#xff0c;它会首先检查该资源是否已经在缓存中。如果资源存在且未过期&#xff0c;浏览器会直接从缓存中加载资源&#xff0c;而不会向服务器发送请求。这种…