缓存 (模拟两种:数据库提供数据到缓存、外界提供数据到缓存)

article/2025/10/6 8:38:33

一、缓存的作用

 因此就有了缓存的作用:

代码模拟上面缓存的作用如下所示:

就拿以前我们做的通过id查询单条数据功能:

当开启服务器后,客户端访问该通过id查询单条数据功能时(假设连续访问两次):

 那么问题来了,客户端要是一直访问该功能百次呢,难不成我们后台也要访问百次数据库?那客户端要是一直访问该功能我们后台就一直访问该功能的数据库,那岂不是上万次相同的操作的话,数据库不就废了

因此我们就可以设置一个缓存,当客户端请求该功能资源超过两次或者更多的时候,我们后台就不再通过访问数据库然后响应给客户端请求的资源了,而是通过该缓存把客户端请求的数据响应给客户(缓存中之所以会有客户端请求的数据资源:因为第一次客户端请求该资源的时候,我们就可以把该客户端的请求资源也存放到缓存当中,当客户端第二次甚至成千上万次再请求该资源的时候,我们后台就不用再调用数据库了,缓存就能直接把数据响应给客户端了,解决了数据库的压力问题

缓存设置代码如下所示:

 /***  定义一个缓存: 用HashMap集合即可 (也就是说把客户端访问过的相同的请求资源存放到HashMap集合的value中)**       HashMap<Integer,Book>  :  Integer----> key    Book----> value*       注:value设置成Book类型的原因是:等会可以把通过id查询出来的数据库中的数据存放到该Book类型的value中*                                          (因为从数据库中查出来的数据就是Book类型)*/private HashMap<Integer,Book> cache = new HashMap<Integer,Book>();/***  5、通过id查询单条数据功能*/@GetMapping(value = "/{id}")public Book selectById(@PathVariable Integer id){/***  判断客户端请求资源的参数id,在缓存:HashMap集合中是否存放了该参数id的资源数据**/Book book = cache.get(id); // HashMap集合中:通过该id获取value数据// 如果该value不为null,就说明该缓存中(HashMap集合中)已经存放了该请求参数id对应数据库中的数据资源// 如果value为null,说明缓存中还没有存放过客户端请求参数id对应的数据,也就是说客户端第一次请求该资源数据//  那么我们就直接让客户端访问数据库就行了,等第二次再请求该id资源的时候,就直接在缓存中响应给客户端数据即可,不再通过数据库if (book == null){// 如果该客户端请求参数id对应的缓存中的value没有数据,就说明客户端是第一次使用该id请求数据,那么直接访问数据库即可// 调用业务层的通过id查询单条数据功能 (最终调用的是数据库)Book book1 = bookService.selectById(id);cache.put(id,book1);    // 把从数据库中查询出来的数据和该此客户端请求的id参数 存放到缓存(HashMap集合中)中去,等第二次客户端再用该请求参数id请求// 数据的时候,直接就判断不为null了,直接从缓存(HashMap集合)中把客户端请求访问的该id参数对应的数据响应给客户端即可// 不再访问数据库了return book1;}return cache.get(id);   // 当多次访问该资源功能的时候,缓存中已经存放该资源数据了,直接就把缓存中的数据响应给客户端即可了,不用再麻烦数据库了}

当设置好缓存后,客户端再访问通过id查询功能:(连续访问两次):

补充知识:通过上面的演示我们知道缓存中的数据是通过数据库提供过来的,是先把数据库中的数据存放到缓存当中,然后当客户端再次请求该资源的时候,直接把缓存中的数据响应给客户端即可

但是还有一种就是缓存中的数据并不是通过数据库提供的,而是从外界把数据存放到缓存当中的。

就比如我们很久没有登录过的一个网站,现在我们登录了让我们输入手机号和一个验证码,我们想这个验证码他肯定不会是存放在数据库当中的,而是临时生成的一个验证码

代码演示如下所示:

package com.Bivin.service.impl;import com.Bivin.service.MsgService;
import org.springframework.stereotype.Service;
import java.util.HashMap;@Service
public class MsgServiceImpl implements MsgService {/***  定义一个缓存:还是用HashMap集合即可*      HashMap<String,String>   : String----> key   String----> value*/private HashMap<String,String> cache=new HashMap<String,String>();/***  String tele: 该参数tele就是获取用户的手机号**  该get方法:就是通过获取客户端填写的手机号,为该手机号生成一个验证码*/@Overridepublic String get(String tele) {/***  我们这里就假定手机号的后六位是验证码*/String code = tele.substring(tele.length() - 6);    // 假设这个手机号的后6位就是我们想要给客户端的验证码cache.put(tele,code);   // 我们直接把手机号和验证码放入到缓存当中,// 当客户端输入手机号和验证码校验的时候,直接通过该客户端的手机号获取对应的value:验证码// 判断一下是否和放入到缓存当中的验证码一致,一致的话就校验成功,不一致就校验失败return code;    // 把验证码响应给客户端,客户端就能拿着这个验证码,然后就能进行校验了}/*** check(String tele, String code):**  String tele: 客户端输入的手机号      String code:客户端输入的验证码**  该check方法: 校验功能*      就是上面get方法,客户端通过输入手机号为该手机号获取到验证码后,就能到这里进行校验了,*      因为上面该手机号生成的验证码我们也放入到了缓存当中了,因此这里只需要比对该用户输入的*      手机号对应的验证码是否和我们存放到缓存中的手机号对应的验证码一致,*      一致的话:就验证成功    不一致的话:就验证失败*/@Overridepublic boolean check(String tele, String code) {String s = cache.get(tele); // 通过客户端输入的手机号,获取到存放在缓存中该手机号对应的验证码return s.equals(code); // 判断客户端输入的验证码是否和缓存中的该手机号对应的验证码一致
}
}

总体代码逻辑:通过上面的代码客户端就可以先访问get方法,通过输入手机号拿到验证码,然后再访问check方法输入手机号和拿到的验证码进行与缓存中的该手机号对应的验证码进行校验。

因此我们也知道了,该缓存中的数据并不是数据库中提供的,而是我们运行的代码中提供的。


http://chatgpt.dhexx.cn/article/PTYlVVMw.shtml

相关文章

mysql的查询缓存

提高单台节点的性能无外乎就那么几种方式&#xff0c;缓存是首当其冲的&#xff0c;因为内存的性能比磁盘高的太多。缓存也是一种典型的空间换时间的策略 缓存的实现也有太多的方式&#xff0c;从静态页面缓存到服务端动态缓存&#xff0c;再到数据库级别缓存等等。随着大数据的…

缓存(本地缓存、分布式缓存)与数据库之间的数据一致性问题?

在现在的系统架构中&#xff0c;缓存的地位可以说是非常高的。因为在互联网的时代&#xff0c;请求的并发量可能会非常高&#xff0c;但是关系型数据库对于高并发的处理能力并不是非常强&#xff0c;而缓存由于是在内存中处理&#xff0c;并不需要磁盘的IO&#xff0c;所以非常…

mysql数据库缓存

一、开启缓存 mysql 开启查询缓存可以有两种方法来开启一种是使用set命令来进行开启&#xff0c;另一种是直接修改my.ini文件来直接设置都是非常的简单的哦。 开启缓存&#xff0c;设置缓存大小&#xff0c;具体实施如下&#xff1a; 1、修改配置文件my.ini windows下是my.i…

mysql 缓存机制

mysql缓存机制就是缓存sql 文本及缓存结果&#xff0c;用KV形式保存再服务器内存中&#xff0c;如果运行相同的sql,服务器直接从缓存中去获取结果&#xff0c;不需要在再去解析、优化、执行sql。 如果这个表修改了&#xff0c;那么使用这个表中的所有缓存将不再有效&#xff0c…

数据库缓存层

一 常见的缓存形式 : 1.文件缓存 (为了避免I/O开销,尽量使用内存缓存) 2.内存缓存 二 为什么要使用缓存 缓存数据是为了让客户端很少甚至不访问数据库服务器进行的数据查询,高并发下,能最大程度降低对数据库服务器的访问压力 一般的数据请求: 用户请求->数据查询->…

SQL查询缓存

适合读者 本教程适合于那些对缓存SQL查询以减少数据库连接与执行的负载、提高脚本性能感兴趣的PHP程序员。 概述 许多站点使用数据库作为站点数据存储的容器。数据库包含了产器信息、目录结构、文章或者留言本&#xff0c;有些数据很可能是完全静态的&#xff0c;这些将会从一个…

数据库之查询缓存

查询缓存配置 查看当前的MySQL数据库是否支持查询缓存SHOW VARIABLES LIKE have_query_cache; 查看当前MySQL是否开启了查询缓存SHOW VARIABLES LIKE query_cache_type; 查看查询缓存的占用大小SHOW VARIABLES LIKE query_cache_size; 查看查询缓存的状态信息show status li…

数据库缓存

一、什么是数据库缓存 我们知道常见的数据库&#xff0c;比如oracle、mysql等&#xff0c;数据都是存放在磁盘中。虽然在数据库层也做了对应的缓存&#xff0c;但这种数据库层次的缓存一般针对的是查询内容&#xff0c;而且粒度也太小&#xff0c;一般只有表中数据没有变更的时…

【技术干货】缓存随谈系列之一:数据库缓存

本文作者: 乔锐杰 现担任上海驻云信息科技有限公司运维总监/架构师。曾任职过黑客讲师、java软件工程师/网站架构师、高级运维、阿里云架构师等职位。维护过上千台服务器,主导过众安保险、新华社等千万级上云架构。在云端运维、分布式集群架构等方面有着丰富的经验。 以…

内连接、外连接、全连接图示语法

外连接 外连接分为外左连接(left outer join)和外右连接(right outer join) left outer join 与 left join 等价&#xff0c; 一般写成left join right outer join 与 right join等价&#xff0c; 一般写成right join左连接&#xff1a;左侧交集部分 语法&#xff1a;…

MySQL 内连接、外连接、左连接、右连接、全连接

建表语句&#xff1a; CREATE TABLE a_table (a_id int(11) DEFAULT NULL,a_name varchar(10) DEFAULT NULL,a_part varchar(10) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8CREATE TABLE b_table (b_id int(11) DEFAULT NULL,b_name varchar(10) DEFAULT NULL,b_part v…

SQL中的各种连接的区别总结(内连接,左连接,左外连接,右连接,右外连接,全连接,全外连接)

在数据库中建立两张表方便大家理解&#xff0c;teacher和student表(student表中的teacherid字段是对应teacher表中的ID&#xff0c;举个例子张三的老师就是李四&#xff0c;没有teacherid就是这个人暂时没有老师) INNER JOIN: 返回两个表的匹配得上的数据&#xff0c;不匹配不…

MYSQL语法:左连接、右连接、内连接、全外连接

文章目录 概念上手使用left join(左连接)rint join(右连接)inner join&#xff08;内连接&#xff0c;等同join&#xff09;full join&#xff08;全连接&#xff0c;等同full outer join&#xff09; 概念 left join&#xff08;左连接&#xff09;&#xff1a;返回包括左表中…

MySQL 的等值连接、交叉连接、左外连接 、右外连接、全外连接实例

1. 测试数据 测试数据如下所示&#xff0c;数据库脚本&#xff08;含数据&#xff09;在文章最后的附录中给出。 测试工具&#xff1a;MySQL8.0 &#xff0c; Navicat Premium。 首先是一个班级表&#xff1a;class&#xff0c;class表中的数据如下所示。 学生表: student&a…

数据库学习之MySQL (十六)—— SQL99 外连接 左外连接 右外连接 全外连接 交叉连接

文章目录 外连接 之 左外连接 与 右外连接为啥要用外连接全外连接总结 内连接 外连接交叉连接 外连接 之 左外连接 与 右外连接 我们先来看个之前的 女神男朋友的案例 传送&#xff1a;数据库学习之MySQL (十三&#xff09;——多表查询 SQL92 SQL99 连接种类划分 我们先考虑…

ORACLE的左右连接,全外连接

先上概念 oracle连接分为&#xff1a; 左外连接&#xff1a;左表不加限制&#xff0c;保留左表的数据&#xff0c;匹配右表&#xff0c;右表没有匹配到的行中的列显示为null。 右外连接&#xff1a;右表不加限制&#xff0c;保留右表的数据。匹配左表&#xff0c;左表没有匹配…

SQL的内连接、左连接、右连接、 交叉连接、全外连接

sql表连接分成 外连接 、 内连接 和 交叉连接。. 外连接包括三种,分别是左外连接、右外连接、全外连接。. 对应的sql关键字:LEFT/RIGHT/FULL OUTER JOIN,通常我们都省略OUTER关键字,写成LEFT/RIGHT/FULL JOIN。. 在左、右外连接中都会以一种表为基表&#xff0c;基表的所有行、…

Mysql中实现全外连接

MySql中多表查询只提供了内连接&#xff0c;左外连接与右外连接&#xff1a; table_reference {[INNER] JOIN | {LEFT|RIGHT} [OUTER] JOIN} table_reference ON conditional_expr 1】INNER JOIN ON内连接&#xff08;只写join时默认为内连接&#xff09; SELECT * FROM emp e…

mysql 全外连接报错的原因

mysql 不支持 直接写full outer join 或者 full join来表示全外连接但是可以用left right union right 代替。 全外连接图&#xff08;非原创图&#xff09; 下面的是全外连接例子&#xff1a; select * from table a A&#xff08;A为别名&#xff09;LEFT JOIN table b B …

Oracle:左连接、右连接、全外连接、(+)号详解

目录 Oracle 左连接、右连接、全外连接、&#xff08;&#xff09;号详解 1、左外连接&#xff08;LEFT OUTER JOIN/ LEFT JOIN&#xff09; 2、右外连接&#xff08;RIGHT OUTER JOIN/RIGHT JOIN&#xff09; 3、全外连接&#xff08;FULL OUTER JOIN/FULL JOIN&#xff0…