当前位置: 首页 > news >正文

OBCP第八章 OB运维、监控与异常处理-数据库监控

系统监控视图:系统视图

OceanBase 数据库为多租户架构,租户分为两种类型:普通租户以及 sys 租户。OceanBase 数据库系统表都存储在 sys 租户,且主键中存储租户号(tenant_id),区分每个租户的内容。每个租户内部创建一个该租户数据的只读视图

租户类型包含系统表类别
SYS租户

核心表

分表位置信息表

模式及用户权限表

DDL 操作相关的表

系统配置相关的表

系统变量及系统状态相关的表

Zone 和服务器等部署相关的系统表

租户、Resource Pool、Unit 相关的系统表
普通租户以 __tenant 作为表名前缀的只读视图,表示租户内信息其它系统表的视图

状态查询SQL

SQL说明注意事项
SELECT * FROM __all_zone查看zone状态

is_merge_error对应的value是否是0

status是否全为ACTIVE

SELECT ZONE, SVR_IP, STATUS,STOP_TIME

FROM __all_server;
查看OBServer状态

status,stop_time 两个字段来标识 OBserver 的状态:

stop_time为0时,表示OBServer为started状态,

不为0时,表示OBServer处于stopped状态

status为active时表示OBServer处于正常状态,

为inactive时表示OBServer处于下线状态,为

deleting时表示OBServer正在被删除

磁盘空间查询SQL

SQL说明注意事项
SELECT * FROM __all_zone;查看Zone状态

is_merge_error对应的value是否是0 status 是否全为ACTIVE

SELECT ZONE,SVR_IP,STATUS,STOP_TIME FROM __all_server;查看OBServer状态

status,stop_time 两个字段来标识 OBserver 的状态:

stop_time为0时,表示OBServer为started状态,不为0时,表示OBServer处于stopped状态status为active时表示OBServer处于正常状态,为inactive时表示OBServer处于下线状态,为deleting时表示OBServer正在被删除

磁盘空间查询SQL

SQL说明注意事项

select total_size,used_size,free_size svr_ip from

__all_virtual_disk_stat;

查询 OceanBase 集群中各 OBServer 的磁盘容量和已使用量

free_size 一般大于800G(根据实际机器配置会有区别)。如果所有server都小于此值,说明集群存储空间不够,应考虑集群扩容

select tenant_id, svr_ip, unit_id, table_id, sum(data_size)

/1024/1024/1024 size_G

from __all_virtual_meta_table group by 1, 2, 3, 4;
记录了副本信息,可按租户,表统计磁盘空间使用如果租户某unit磁盘空间占用过大(比如>4TB)应考虑增加租户unit。如果单表磁盘空间占用过大 (比如>200GB),应考虑对表进行分区。只包含 SSTable磁盘空间,不含memTable内存中数据

历史事件查询SQL

__all_rootservice_event_history和__all_server_event_history分别记录集群级别和OBServer级别的历史事件。可以通过这两张表查询不同事件的信息,下表以查看转储事件为例

 

SQL说明注意事项
select* from __all_rootservice_event_history WHERE event LIKE ‘%minor%’ORDER BY gmt_create DESC LIMIT 10;

系统租户从

RootService 角度查看最近10次的转储记录

__all_rootservice_event_history记录集群级事件,如major freeze, 合并,server 上下线,修改primary_zone引发的切主

操作、负载均衡任务执行等,保留 7 天内的数据

SELECT * FROM __all_server_event_history WHERE

svr_ip='192.168.100.1' AND module IN ('freeze',

'minor_merge') ORDER BY gmt_create DESC LIMIT 10;
系统租户查看具体某台OBServer 的转储情况

__all_server_event_history

记录server级事件,如转储,用户发起的系统命令,保留 2 天内的数据

机器剩余资源查询SQL

select b.zone, a.svr_ip, a.cpu_total, a.cpu_assigned cpu_ass, a.cpu_assigned_percent
cpu_ass_percent,round(a.mem_total/1024/1024/1024, 2) as mem_total, 
round(a.mem_assigned/1024/1024/1024, 2) mem_ass,round((a.mem_totala.mem_assigned)/1024/1024/1024, 2) as mem_free,a.mem_assigned_percent mem_ass_percent
from __all_virtual_server_stat a,__all_server b where a.svr_ip = b.svr_ip order by zone,cpu_assigned_percent desc;
select zone,
concat(svr_ip, ':', svr_port) observer,
cpu_capacity,
cpu_total,
cpu_assigned,
cpu_assigned_percent,
mem_capacity/(1024*1024*1024) mem_capacity,
mem_total/(1024*1024*1024) mem_total,
mem_assigned/(1024*1024*1024) mem_assigned,
mem_assigned_percent,
unit_Num,
round('load', 2) 'load',
round('cpu_weight', 2) 'cpu_weight',
round('memory_weight', 2) 'mem_weight',
leader_count
from __all_virtual_server_stat
order by zone, svr_ip;

如果某个zone中所有server的某项指标(cpu_ass_percent, mem_ass_percent) 都比较高(>90),后续加租户或扩租户资源可能会因资源不够失败,可考虑集群扩容

系统性能视图:gv$memory

gv$memory展示当前租户在所有OBServer上各个模块的内存使用情况,基于__all_virtual_memory_info创建

字段名称类型说明
CONTEXTvarchar(256)内存所属Mod名称
COUNTbigint(20)当前该 Mod 使用中的内存单元个数
USEDbigint(20)Mod当前使用的内存数值,单位:Byte
ALLOC_COUNTbigint(20)该Mod申请的内存总个数
FREE_COUNTbigint(20)该Mod释放的内存总个数

系统性能视图:gv$memstore

gv$memstore展示所有服务器上所有租户的MEMTable的内存使用状况,以__all_virtual_tenant_memstore_info创建

select * from gv$memstore;
字段名称类型说明
ACTIVEbigint(20)当前活跃的MEMTable的内存占用大小
TOTALbigint(20)

当前该 Mod 使用中的内存单元个数,包括 active + frozen memstore(Byte)

FREEZE_TRIGGERbigint(20)触发 MEMTable 冻结的内存大小(Byte)
MEM_LIMITbigint(20)MEMTable 的内存大小限制(Byte)
FREEZE_CNTbigint(20)MEMTable 的冻结次数

系统性能视图:gv$sql_audit

gv$sql_audit视图用于展示所有 Server 上每一次 SQL 请求的来源、执行状态等统计信息。该视图是按照租户拆分的,除了系统租户,其他租户不能跨租户查询

检查特定租户下Top 10的sql执行时间:

select sql_id, query_sql,count(*), avg(elapsed_time), avg(execute_time), avg(queue_time), avg(user_io_wait_time) 
from gv$sql_audit where tenant_id=1002 group by sql_id
having count(*)>1 order by 5 desc limit 10\G

检查特定租户下消耗cpu最多的top sql:

select sql_id, avg(execute_time) avg_exec_time, count(*) cnt, 
avg(execute_time-TOTAL_WAIT_TIME_MICRO) cpu_time
from gv$sql_audit where tenant_id=1002 
group by 1 order by avg_exec_time * cnt desc limit 5;

系统性能视图:gv$sql

gv$sql用于记录所有热更新的 SQL 相关统计信息,记录每个 Plan 上的统计信息,汇总单个 Plan 多次执行的统计信息,每个 Plan 都会在表中有一行。下表对gv$sql部分字段进行简单归类:

字段类别详细说明
用于定位SQL的字段

[CON_ID : 租户 ID] [SVR_IP : IP 地址] [SVR_PORT : 端口号] [PLAN_ID : 执行计划的 ID] [SQL_ID : SQL 的标识符] [TYPE : SQL 类型,local remote distribute] [SQL_TEXT : SQL 语句文本] [PLAN_HASH_VALUE :执行计划的 Hash 值]

SQL执行时间类统计字段[FIRST_LOAD_TIME : 第一次执行时间] [LAST_ACTIVE_TIME : 上一次执行时间][AVG_EXE_USEC : 平均执行耗时] [SLOWEST_EXE_TIME : 最慢执行开始时间点][SLOWEST_EXE_USEC :最慢执行消耗时间] [SLOW_COUNT :慢查询次数统计]
SQL执行效率类统计字段

[HIT_COUNT : 命中 Plan Cache 的统计] [PLAN_SIZE : 物理计划占用的内存][EXECUTIONS : 执行次数] [DISK_READS : 读盘次数] [DIRECT_WRITES : 写盘次数]

[BUFFER_GETS : 逻辑读次数] [ELAPSED_TIME : 完成总消耗时间]

[CPU_TIME : 消耗的 CPU 时间]

系统性能视图:gv$plan_cache_plan_statgv$plan_cache_plan_stat 视图详细记录了当前租户在所有 Server 上的计划缓存中缓存的每一个缓存对象的状态。该表不仅缓存了 SQL 计划对象,也缓存了PL对象(如匿名块、PL Package 以及 PL Function),某些字段只在特定对象下有效

gv$plan_cache_plan_stat记录的信息与gv$sql视图相似,但更加丰富,下表列出一些多出的字段

字段名称

类型

说明

LARGE_QUERYS

bigint(20)

被判断为大查询的次数

DELAYED_LARGE_QUERYS

bigint(20)

被判断为大查询且被丢入大查询队列的次数

DELAYED_PX_QUERYS

bigint(20)

并行查询被丢回队列重试的次数

OUTLINE_ID

bigint(20)

Outline 的 ID,为 -1 表示不是通过绑定 Outline 生成的计划

OUTLINE_DATA

bigint(20)

计划对应的 Outline 信息

TABLE_SCAN

bigint(20)

表示该查询是否为主键扫描

TIMEOUT_COUNT

bigint(20)

超时的次数

系统性能视图:gv$plan_cache_plan_explain

gv$plan_cache_plan_explain视图用于展示缓存在全部的 Server 中的计划缓存中的物理执行计划。

该视图仅支持 get 操作,查询时需要指定 IP、PORT、TENANT_ID、PLAN_ID 字段

select * from gv$plan_cache_plan_stat limit 5\G;

性能监控:常规监测

性能问题应优先通过OCP 管理员入口 ==> 集群入口 ==>性能 监控==> 数据趋势中查看QPS_RT, TPS_RT,大致定位出问题时间点

性能监控:捞取慢SQL

OceanBase中执行时间超过 trace_log_slow_query_watermark (系统参数)的sql,在 OBServer日志中都会打slow query消息

在 OBServer 日志中查找慢 SQL 消息:

fgrep '[slow query]' observer.log |sed -e 's/|/\n/g' | more <--查看日志中所有的 slow query

grep '<trace_id>' observer.log |sed -e 's/|/\n/g' | more <---根据trace_id 查询某个 slow query

参数说明默认值
trace_log_query_watermark设置查询的执行时间阈值,如果查询的执行时间超过该阈值,则被认为是慢查询100ms

性能监控:捞取慢SQL

[process begin] [query begin] 等方框号内的名称是指SQL执行经过的每一个内部模块

trace_id与gv$sql_audit里的trace_id字段对应\

stmt是指执行的SQL

u代表每一步消耗的时间,单位是微秒

total_timeu是指整个过程消耗的总时间

性能监控:捞取慢SQL

OceanBase提供两张虚拟表 v$sql_audit , gv$sql_audit记录最近一段时间sql执行历史

v$sql_audit 存储本机的sql执行历史, gv$sql_audit存储整个集群的sql执行历史

查询v$sql_audit表,如查询某租户执行时间大于1s的SQL:

select * from v$sql_audit where tenant_id = <tenant id>
and elapsed_time > 1000000 limit 10;

 查询SQL执行时间按秒分布的直方图:

select round(elapsed_time/1000000), count(*) from v$sql_audit
where tenant_id = <tenant_id> group by 1;

性能监控:捞取慢SQL

OBProxy有自己的慢查询日志打印功能,通过设置OBProxy的配置项控制打印到日志中的SQL或事务的处理时间阈值;根据实际需求修改OBProxy配置项:

ALTER PROXYCONFIG SET slow_transaction_time_threshold='100ms';
ALTER PROXYCONFIG SET slow_proxy_process_time_threshold='5ms';
参数说明默认值
slow_transaction_time_threshold指慢查询或事务的整个生命周期的s时间阈值,超过了该时间,就会打印相关日志5s
slow_proxy_process_time_threshold在发往 Server 前 Proxy 本身的处理时间,包括获取集群信息、路由信息、黑名单信息等2ms
slow_query_time_threshold指从OBProxy获取 SQL直到返回给客户端之前的这段时间的阈值,超过了该时间,也会打印相关日志500ms

OBProxy慢查询举例

修复慢SQL

创建索引:当慢SQL因无合适索引可用时导致时,可创建索引

outline绑定:如慢SQL由OceanBase优化器选择了不够优的执行计划导致,可通过outline绑定执行计划。有两种方式创建outline:

通过 SQL_TEXT创建(用户执行的带参数的原始语句)

通过 SQL_ID 创建

CREATE [OR REPLACE] OUTLINE outline_name ON stmt [TO target_stmt]; //SQL_TEXT方式
CREATE OUTLINE outline_name ON sql_id USING HINT hint; //SQL_ID方式

相关文章:

OBCP第八章 OB运维、监控与异常处理-数据库监控

系统监控视图&#xff1a;系统视图 OceanBase 数据库为多租户架构&#xff0c;租户分为两种类型&#xff1a;普通租户以及 sys 租户。OceanBase 数据库系统表都存储在 sys 租户&#xff0c;且主键中存储租户号&#xff08;tenant_id&#xff09;&#xff0c;区分每个租户的内容…...

已经提了离职,还有一周就走,公司突然把我移出企业微信,没法考勤打卡, 还要继续上班吗?...

黎明前的黑暗最容易出事&#xff0c;离职前的几天也最容易出幺蛾子&#xff0c;比如下面这位网友的遭遇&#xff1a;已经提了离职&#xff0c;还有一周就正式离职了&#xff0c;公司突然把我移出企业微信&#xff0c;没法考勤打卡了&#xff0c; 还要继续上班吗&#xff1f;该怎…...

Win11启用IE方法

呉師傅 Win11是微软目前的最新系统&#xff0c;尽管该系统非常不错&#xff0c;但是还是有很多不一样的地方&#xff0c;有的用户发现Win11没有了IE浏览器&#xff0c;那么Win11没有IE浏览器怎么办呢&#xff0c;有的旧网页需要IE浏览器才能进入&#xff0c;下面就给大家提供一…...

有人靠ChatGPT 狂赚200W !有人到现在,连账号都没开通......

作者| Mr.K 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)互联网风水轮流转&#xff0c;当初元宇宙盛极一时之际&#xff0c;在一些知识付费平台上&#xff0c;任何一个关于元宇宙的课程或培训&#xff0c;都很热销&#xff0c;有一定号召力的博主&#xff0c;登…...

基于GD32F470的mbedtls 3DES算法测试

3DES加密算法介绍 3DES数据加密算法是一种可逆的对称加密算法&#xff0c;也称三重数据加密算法。3DES块加密算法的设计用来提供一种相对简单的方法&#xff0c;即通过增加DES的密钥长度来避免类似的攻击&#xff0c;而不是设计一种全新的密码算法&#xff0c;目前3DES作为DES…...

为什么一些人很瞧不起 Java?

前言 瞧不起Java的大概是因为&#xff1a; Java 被认为是一门“老”语言&#xff0c;过时了。事实上&#xff0c;Java 由于其稳定性和安全性&#xff0c;一直是企业级应用开发的首选语言。而且&#xff0c;Java 语言还在不断更新和发展&#xff0c;例如 Java 8 引入了很多新特…...

DropMAE: Masked Autoencoders with Spatial-Attention Dropout for Tracking Tasks

摘要 ​ 在本文中&#xff0c;我们研究了掩码自动编码器&#xff08;MAE&#xff09;预训练的视频基于匹配的下游任务&#xff0c;包括视觉目标跟踪&#xff08;VOT&#xff09;和视频对象分割&#xff08;VOS&#xff09;。MAE的一个简单扩展是在视频中随机掩码帧块并重建帧像…...

【shell 基础(11)循环之for】带列表:空格子串、换行子串、展开、命令替换、seq;不带列表:接受参数、类C

文章目录一. 带列表的for循环1. 语法2. 例子2.1. 循环字串2.2. 展开或命令替换&#xff1a;数字循环2.3 命令替换&#xff08;输出换行&#xff09;作为list二. 其他for循环1. 不带列表的循环2. 类C的for循环一. 带列表的for循环 1. 语法 for var in list do commanddone注意…...

虚拟环境中创建Django项目 详细完整

一、自身安装python&#xff08;我自身安装的python3.6.8&#xff09; &#xff08;1&#xff09;官网&#xff1a; Python Releases for Windows | Python.org for windows> 这样下载慢的话&#xff0c;以下链接复制到迅雷下载&#xff1a; https://www.python.org/ftp/…...

BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC

BCSP-玄子JAVA开发之JAVA数据库编程CH-08_JDBC 8.1 JDBC 介绍 8.1.1 什么是 JDBC JDBC&#xff08;Java Database Conectivity&#xff09; Java数据库连接技术的简称&#xff0c;提供连接各种常用数据库的能力 8.1.2 JDBC 的工作原理 JDBC API 内容&#xff1a;供程序员…...

一位程序员将一款开源工具变成了价值75亿美元的帝国

他的成功&#xff0c;激励着年轻的程序员为什么翻译这些程序员大佬的成功故事&#xff1f;除了写代码&#xff0c;作为开发者&#xff0c;我们也需要时不时地仰望星空。我们每个人都怀有着远大的理想&#xff0c;希望用代码改变自己的生活、行业&#xff0c;甚至是这个世界。编…...

tmux | 终端操作软件,解决深度学习中终端相关问题

tmux 一次可运行多个终端会话。或者在后台运行终端会话。当需要一次访问多个 ssh 会话或只是为了一个便利的流程管理时&#xff0c;这很有帮助。例如&#xff0c;可以在下载最新的系统更新时运行 htop&#xff0c;编辑配置文件并在一个 tmux 会话中重新启动服务。 对于我来说t…...

信号 捕捉

signal 函数 作用&#xff1a;注册一个信号捕捉函数&#xff08;注册而非创建&#xff09; 原型&#xff1a; sighandler_t signal(int signum, sighandler_t handler);typedef void (*sighandler_t)(int);案例一&#xff1a; signal函数 捕捉 ctrlc 触发事件 #include<std…...

sqlserver中判断是否存在的方法

自定义变量 declare age int declare name varchar(20) set name‘张三’ --用set 方法给变量赋值 注&#xff1a; 此方法一次只能给一个变量赋值 select ageage from client where [name]name --查询客户张三的年龄赋值给age变量 注&#xff1a;此方法能一次多个变量赋值 …...

基于Kettle跑批的案例说明

需求概述 通过动态配置表的方式完成在kettle里动态配置参数&#xff0c;并调用ktr&#xff0c;实现跑批的目的。 问题分析 定义一个ktr读取配置表的信息并将拷贝记录到结果定义一个ktr从结果里获取记录并设置变量定义业务ktr&#xff08;即按照业务需要开发的…...

2023 最新版网络安全保姆级自学指南

前言 如今&#xff0c;组织的信息系统和数据面临着许多威胁。而人们了解网络安全的所有基本要素是应对这些威胁的第一步。 网络安全是确保信息完整性、机密性和可用性(ICA)的做法。它代表了应对硬盘故障、断电事故&#xff0c;以及来自黑客或竞争对手攻击等防御和恢复能力。而…...

Chapter9.3:线性系统稳定性分析及综合实例

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…...

EXCEL 在复杂查询时摒弃vlookup() sumif() 等公式,而使用数据透视表的初步学习

1 为什么要用数据透视表 如果不用&#xff0c;就可能需要写很复杂的&#xff0c;查询公式 比如&#xff0c;vlookup各种sumif,sumifs 等等&#xff0c;如果还是多个表进行统计&#xff0c;那写起来更酸爽所以感觉 vlookup sumif,sumifs 更适合&#xff0c;简单情况下的查询&am…...

C 文件读写

C 文件读写 本章我们将介绍 C 程序员如何创建、打开、关闭文本文件或二进制文件。 一个文件&#xff0c;无论它是文本文件还是二进制文件&#xff0c;都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数&#xff0c;也提供了底层&#xff08;OS&#xff09;调用来处理存…...

Linux中实现程序开机自启——将程序配置为系统服务

一、需求说明 当我们在Linux系统上安装软件时,希望软件实现开机自启,或程序崩溃后自动重启,提升软件运行的稳定性;而linux系统中的systemd刚好可以满足我们的要求(可将软件注册为系统服务)。 二、systemd systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务…...

【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(13)

目录 写在前面&#xff1a; 题目&#xff1a;P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码&#xff1a; AC &am…...

【新2023Q2模拟题JAVA】华为OD机试 - 总最快检测效率 or 核酸检测效率

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:报数 题目 一百个人围成一圈…...

基于主成分分析的混音方法

一、简介&#xff1a; 基于主成分分析的混音方法是一种常见的音频混音技术&#xff0c;它利用主成分分析&#xff08;PCA&#xff09;对音频信号进行降维和重构&#xff0c;从而实现混音。 二、基本步骤如下&#xff1a; 采集和存储需要混音的音频信号。 对音频信号进行主成分…...

Code Two Exchange Crack

CodeTwo Exchange 迁移允许直接从早期版本的 Exchange&#xff08;从 Exchange 2010 开始&#xff09;安全、轻松地迁移到 Exchange 2019 和 2016。此服务器应用程序还允许您集中管理来自 Microsoft 365 (Office 365) 的邮箱迁移以及来自基于 IMAP 的电子邮件系统&#xff08;例…...

jQuery.form.js 详细用法_维护老项目使用

概述 jquery-3.3.1.min.js &#xff1a; http://jquery.com/download jquery.form.min.js &#xff1a;http://malsup.com/jquery/form/#tab7 jquery form 是一个表单异步提交的插件&#xff0c;可以很容易提交表单&#xff0c;设置表单提交的参数&#xff0c;并在表单提交前…...

【Java】关于你不知道的Java大整数运算之BigInteger类超级好用!!!

目录 一、BigInteger类简单介绍 二、BigInteger构造方式 &#xff08;1&#xff09;构造方式 &#xff08;2&#xff09;输入方式 三、BigInteger常见的成员方法 &#xff08;1&#xff09;方法介绍 &#xff08;2&#xff09;方法使用演示 1.加减乘除余 2.比较 3.绝…...

运维是不是没有出路了?

瑞典马工的​​《是时候让运维集体下岗了》一出&#xff0c;就让运维人为之一颤&#xff0c;​人人自危。文章开篇就提到&#xff1a;​​明人不说暗话&#xff0c;在云原生和DevOps成熟的今天&#xff0c;运维作为一个岗位和团队已经完成了历史任务&#xff0c;应该退出舞台了…...

【C++笔试强训】第七天

选择题 解析&#xff1a;内联函数&#xff08;inline&#xff09;一般用于代码较少&#xff0c;代码块里面没有递归且频繁调用的函数&#xff0c;是一种以空间换时间&#xff08;不是指内存&#xff0c;而是指令变多编译出来的可执行程序会变大&#xff09;的做法。内联函数在预…...

mysql binlog 一直追加写,磁盘满了怎么办?

文章目录 mysql binlog 清理策略1、设置binlog最大的文件数和文件大小2、定时清理过期binlog文件3、手动清理binlog文件4、禁用或启用binlogmysql binlog用于记录mysql数据库所有变更(数据库的DDL、DML操作)包括用户执行的语句,以及底层引擎所执行的操作的二进制日志,主要用…...

缓存穿透、缓存雪崩、缓存击穿解决方案

什么是缓存 缓存就是数据交换的缓冲区&#xff08;称作Cache&#xff09;,是存贮数据的临时地方&#xff0c;一般读写性能较高。 添加 redis 缓存 给店铺类型查询业务添加缓存 需求&#xff1a;添加ShopTypeController中的queryTypeList方法&#xff0c;添加查询缓存 缓存更新…...