SpringBoot 缓存

news2025/4/5 1:26:07

在这里插入图片描述

个人简介: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 {
    @Autowired
    private CodeUtils utils;  //自动装配工具类对象(工具类中提供了生成验证码的算法)

    @Override
    //@Cacheable注解不适用,缓存会被读取,导致前后两次验证码重复
    //@Cacheable(value="smsCode",key = "#phoneNumber")
    //@CachePut注解,缓存只可放不可读
    @CachePut(value="smsCode",key = "#phoneNumber")
    public String sendCodeToSMS(String phoneNumber) {
        return utils.generator(phoneNumber);
    }

    @Override
    public boolean checkCode(SMSCode smsCode) {
        //取出内存中的验证码与传递过来的参数比对,如果相同,返回true
        String 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 {

    @Autowired
    private SMSCodeService service; //自动装配业务层组件

    //获取验证码
    @GetMapping
    public String getCode(String phoneNumber){
        String code = service.sendCodeToSMS(phoneNumber);
        return code;
    }

    //判断验证码是否正确
    @PostMapping
    public 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:缓存清除策略-->
    <defaultCache
        eternal="false"
        diskPersistent="false"
        maxElementsInMemory="1000"
        overflowToDisk="false"
        timeToIdleSeconds="60"
        timeToLiveSeconds="60"
        memoryStoreEvictionPolicy="LRU" />

    <cache
        name="smsCode"  
        eternal="false"
        diskPersistent="false"
        maxElementsInMemory="1000"
        overflowToDisk="false"
        timeToIdleSeconds="10"
        timeToLiveSeconds="10"
        memoryStoreEvictionPolicy="LRU" />

</ehcache>

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

在这里插入图片描述

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

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

相关文章

循迹/跟随/摇头避障小车

循迹小车 智能小车2-循迹小车-CSDN博客 接线 B-1A -- PB0 B-1B -- PB1 A-1A -- PB2 A-1B -- PB10 循迹模块(左) -- PB3 循迹模块(右) -- PB4 CubeMx 在CubeMx配置,并重定义,在main.h会自动生成 #define B_1A_Pin GPIO_PIN_0 #define B_1A_GPIO_Port GPIOB #defi…

【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 找到自己的docker-compose.yml文件2.2 重新编辑docker-compose.yml文件2.3 通过docker-componse重新运行docker-compose.yml文件2.4 重新启动docker容器2.5 查看seata信息 一、问题描述 1.1 产生原因 因为我是…

【国标语音对讲】EasyCVR视频汇聚平台海康/大华/宇视摄像头GB28181语音对讲配置

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…

嵌入式学习58-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices insmod …

LINUX系统编程:软硬链接,动静态连接

1.硬连接 什么是硬连接?,我们或许可以用操作清楚的认识什么是硬连接。 在我们学习文件的时候这个数字好像完全没有被提到过&#xff0c;这个代表什么意思呢&#xff1f; 这个代表该文件的inode编号与文件映射的次数&#xff0c;现在该文件的inode只与test.c这个文件名映射&a…

使用grasshopper修改梁的起始点方向

一般北方向朝上的情况&#xff0c;梁的方向从南向北&#xff0c;从西向东。 现在使用grasshopper来判断起始点坐标&#xff0c;分辨是否错误。 交换起始点这个&#xff0c;我实在不会用电池操作&#xff0c;只好敲python代码实现了。代码如下&#xff1a; 如果会敲代码的同学…

Git | 远程操作

Git | 远程操作 文章目录 Git | 远程操作0、分布式版本控制系统概念1、创建远程仓库2、克隆远程仓库https方式ssh方式 3、推送至远程仓库4、本地拉取远程仓库5、配置Git忽略特殊文件给命令配置别名 6、标签管理创建标签操作标签 0、分布式版本控制系统概念 Git是一个分布式版本…

【小迪安全2023】第58天:服务攻防-应用协议设备KibanaZabbix远控向日葵VNCTV

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

RPA机器人怎么操作知乎好物推荐自动点击【添加】商品按钮?

先看需要实现的效果&#xff08;启动机器人-点击收益&#xff08;打开商品卡片列表&#xff09;-点击添加&#xff08;自动添加商品卡片到文章&#xff09;&#xff09;&#xff1a; 学员提问&#xff1a; 知乎上点击好物推荐【添加】商品按钮&#xff0c;iframe的元素是动态的…

力扣每日一题-查询网格图中每一列的宽度-2024.4.27

力扣题目&#xff1a;查询网格图中每一列的宽度 题目链接: 2639.查询网格图中每一列的宽度 题目描述 代码思路 双层for循环遍历整个矩阵容易想到&#xff0c;只要能想到使用整数转字符串的技巧&#xff08;“” 字符串&#xff09;&#xff0c;即可完成题目 代码纯享版 c…

基于SpringBoot + Vue实现的家政服务管理系统设计与实现+毕业论文+答辩PPT+指导搭建视频(包运行成功)

目录 项目介绍 论文展示 资源获取 项目介绍 家政服务管理平台是一个管理信息系统&#xff0c;为了宣传的需要&#xff0c;为了给用户提供方便快捷的服务&#xff0c;从而设计了家政服务管理平台。管理员可以通过这个系统把家政服务信息发布出去&#xff0c;可以方便用户快…

【AI导师写作】毕业论文答辩PPT生成

无论是大专、本科或者硕博&#xff0c;撰写毕业论文、开题报告、文献综述、任务书、课程论文、调研报告等都是必不可少的一件事。而这些任务重往往都需要我们花费大量的时间和精力&#xff0c;而“AI导师写作”在这一方面无疑提供了高效和便捷。可毕业季的论文答辩也是每个学者…

TCP/IP协议族中的TCP(二):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 滑动窗口 在前面我们讨论了确认应答策略, 对每一个发送的数据段, 都要给一个ACK确认应答. 收到ACK后再发送下一个数据段.这样…

VulnHub靶机 DC-9 靶机 详细渗透过程

VulnHub靶机 DC-9 打靶实战 详细渗透过程 目录 VulnHub靶机 DC-9 打靶实战 详细渗透过程一、将靶机配置导入到虚拟机当中二、渗透测试主机发现端口扫描Web渗透SQL注入登入后台文件包含SSH爆破提权 一、将靶机配置导入到虚拟机当中 靶机地址&#xff1a; https://www.vulnhub.…

JSP在页面用<%=调用声明函数时出现HTTP 500错误

JSP在页面用<%调用声明函数时出现HTTP 500错误 错误描述&#xff1a; Eclipse在编写JSP页面时&#xff0c;在其中采用<%&#xff01;%>方式声明了函数&#xff0c;然后在页面中用<%函数名%>方式调用时&#xff0c;出现HTTP状态500错误&#xff0c;提示为&#…

C语言-结构体尺寸

CPU字长 字长的概念指的是处理器在一条指令中的数据处理能力&#xff0c;当然这个能力还需要搭配操作系统的设定&#xff0c;比如常见的32位系统、64位系统&#xff0c;指的是在此系统环境下&#xff0c;处理器一次存储处理的数据可以达32位或64位。 地址对齐 当计算机系统的…

智能酒精壁炉与酒店会客厅的氛围搭配

智能酒精壁炉在酒店会客厅的氛围搭配可以创造出舒适、温馨和现代的环境。以下是智能酒精壁炉与酒店会客厅氛围搭配的优势和建议&#xff1a; 提升装饰效果&#xff1a; 安装智能酒精壁炉可以显著提升会客厅的装饰效果。壁炉作为焦点装饰&#xff0c;增添了现代感和奢华感&…

STM32的端口引脚的复用功能及重映射功能解析

目录 STM32的端口引脚的复用功能及重映射功能解析 复用功能 复用功能的初始化 重映射功能 重映射功能的初始化 复用功能和重映射的区别 部分重映射与完全重映射 补充 STM32的端口引脚的复用功能及重映射功能解析 复用功能 首先、我们可以这样去理解stm32引脚的复用功能…

车道分割YOLOV8-SEG

车道分割YOLOV8-SEG&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTHON,ANDROID开发 车道分割YOLOV8-SEG

【C++ | 复合类型】结构体、共用体、枚举、引用

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…