P99延迟:系统性能优化的关键指标
理解P99延迟
当谈论系统性能时,延迟指标扮演着至关重要的角色。其中,P99延迟作为最重要的性能指标之一,能够帮助我们识别系统的性能瓶颈,优化用户体验。
构建一个功能完善的后端系统,通过了所有功能测试,准备部署到生产环境。但在部署前被要求提供系统性能指标的详细信息:平均延迟、中位数延迟、最大延迟,以及关键的P90、P95、P99延迟数据。这些指标将直接影响你的系统能否满足服务水平协议(SLA)的要求。
延迟指标基础
延迟(Latency) 是指从发出请求到收到响应之间的时间间隔。在API服务中,延迟期间是指API响应请求所需的时间,通常以毫秒(ms)或秒(s)为单位测量。
- 低延迟 = 快速响应,良好用户体验
- 高延迟 = 缓慢响应,用户体验不佳
在评估系统性能时,我们常用的基本统计指标包括:
- 平均延迟:所有响应时间的平均值
- 中位数延迟:将所有响应时间排序后的中间值
- 最大延迟:系统响应请求的最长时间
但这些传统指标存在明显的局限性:
- 平均值和中位数会掩盖异常值:即使99%的请求响应很快,1%的慢请求也可能严重影响用户体验
- 最大值容易受到极端异常值影响:一个偶发的网络故障可能导致极高的最大延迟,但这不代表系统的真实性能水平
这就是为什么需要百分位数指标。
理解百分位数和P99延迟
百分位数是一个统计概念,表示数据集中低于该值的观测值所占的百分比。
更正式地说,分布的第k个百分位数(k=1,2,…,100)大于或等于同一分布中k%的值。
P90、P95、P99的含义
通过一个具体的例子来理解。假设一个API服务接收到100个请求:
P90延迟:
- 90个请求的响应时间 < 80ms
- 10个请求的响应时间 > 80ms
- 结论:P90 = 80ms,意味着90%的请求在80ms内完成
P95延迟:
- 95个请求的响应时间 < 90ms
- 5个请求的响应时间 > 90ms
- 结论:P95 = 90ms,意味着95%的请求在90ms内完成
P99延迟:
- 99个请求的响应时间 < 120ms
- 1个请求的响应时间 > 120ms
- 结论:P99 = 120ms,意味着99%的请求在120ms内完成
P90 和 P99 延迟的区别是什么?
P90 和 P99 延迟的核心区别在于它们对异常值的处理方式以及它们反映的系统性能。
P90 展示了大多数请求的响应时间上限——这是大多数用户会遇到的典型最坏情况。只有最极端的情况被排除在外。
P99 则反映了响应时间的尾部,表示 99% 的请求处理速度快于此阈值,只有 1% 的请求响应时间更慢。这些是罕见但影响较大的响应时间大幅恶化的情况。
P99延迟的重要性
P99延迟之所以成为关键指标,原因如下:
- 捕捉用户体验的边缘情况:虽然只有1%的用户遇到超过P99阈值的延迟,但这些用户的体验可能极差
- 平衡稳定性和敏感性:P99比最大值更稳定(不易受单个异常值影响),又比平均值和中位数更敏感(能反映性能问题)
- 业务影响显著:在高流量系统中,1%的慢请求仍然代表大量的用户
百分位数的计算方法
对于一个包含n个延迟记录的数据集,计算第p个百分位数的步骤:
- 排序:将所有数据按非递减顺序排列
- 计算排名:
Rank_p = ceil((p/100) * n)
- 获取值:
Percentile_p = d[Rank_p]
实际计算示例:
假设有15个学生的测验成绩:89, 92, 34, 45, 67, 75, 37, 55, 66, 44, 98, 99, 77, 72, 39
计算P90:
- 排序:34, 37, 39, 44, 45, 55, 66, 67, 72, 75, 77, 89, 92, 98, 99
- P90排名:
ceil((90/100) * 15) = ceil(13.5) = 14
- P90值:第14个位置的值 = 98
因此,这个数据集的P90 = 98,意味着90%的学生得分≤98。
服务水平协议(SLA)和P99
服务水平协议(SLA) 是服务提供商与客户之间的正式承诺,明确定义了服务质量标准和相应的责任。
SLA示例:
- “我们保证API服务99.9%的时间可用”
- “99%的API请求响应时间不超过100ms”
- “P99延迟不超过500ms”
网络管理员和SRE工程师选择优化P99延迟的原因:
- 改善峰值负载下的整体响应时间
- 基于百分位数的警报具有较低的假阳性率
- 这类警报波动性小,能准确反映重要的性能下降事件
P99延迟优化就像在最坏情况下最大化性能,同时避免被极端异常值误导。
P99延迟优化的四大策略
既然理解了P99延迟的重要性,接下来我们探讨如何在实际系统中改善这一关键指标。
策略1:实施缓存解决方案
缓存是提高高频访问数据性能的强大方法。有效的缓存策略包括:
多层缓存架构
客户端缓存 → CDN缓存 → 应用层缓存 → 数据库缓存
- 缓存一致性:确保数据更新不会导致陈旧缓存
- 智能缓存策略:基于时间分析和领域驱动设计确定缓存内容
- 内存数据存储:利用Redis或Memcached
- TTL和过期策略:确保缓存数据新鲜度
- 缓存预热和分片:避免雪崩效应
- 监控缓存命中率:持续优化策略
策略2:优化查询和数据库调用
数据库查询往往是性能瓶颈的主要来源。优化策略包括:
查询优化
- 审计慢查询:使用数据库分析工具识别性能瓶颈
- 索引优化:
- 基于查询模式构建合适的索引
- 使用复合索引和覆盖索引
- 定期维护索引统计信息
查询结构优化
- 避免N+1查询问题
- 减少不必要的表连接
- 优化子查询
- 使用懒加载技术
- 限制返回数据量
数据库架构优化
- 连接池:减少连接管理开销
- 批处理操作:降低频繁请求的管理开销
- 读写分离:使用只读副本分散负载
- 数据库分片:水平扩展应对高流量
- 异步处理:减少阻塞查询的影响
策略3:识别并解决尾延迟问题
尾延迟(Tail Latency)指的是影响P99等高百分位延迟的慢请求。解决策略包括:
全面监控和追踪
- 详细日志记录:捕获关键性能数据
- 分布式追踪:使用OpenTelemetry或Jaeger
- 系统指标监控:CPU、内存、网络使用率
- 应用级别指标:请求处理时间、队列长度等
通用改善策略
- 超时和回退机制:
- 设置合理的超时时间
- 实施指数退避策略
- 配置断路器模式
- 服务降级:在高负载时提供基本服务
- 请求丢弃:主动丢弃过期请求
慢路径分析
- 代码性能分析:识别热点路径
- 端到端追踪:分析完整请求链路
- 资源争用检测:识别锁竞争和序列化瓶颈
负载均衡优化
- 智能路由算法:超越简单的轮询方式
- 实时健康检查:基于后端服务状态进行路由
- 避免热点问题:确保负载均匀分布
策略4:现代可观测性工具
持续监控和改进依赖于可靠的可观测性实践。关键工具和实践包括:
指标收集和可视化
- 监控平台:Prometheus + Grafana组合
- 自定义仪表板:专门展示P99延迟趋势
- 合理采样:平衡详细度与存储成本
分布式追踪
- 服务图可视化:了解服务间依赖关系
- 火焰图分析:识别性能热点
- 追踪采样策略:在性能和存储间找到平衡
日志聚合
- 统一日志格式:便于分析和关联
- 结构化日志:包含关键上下文信息
- 日志与追踪关联:构建完整的观测视图
测试和基准
- 负载测试:模拟生产环境流量
- 压力测试:验证系统极限
- 混沌工程:主动发现系统弱点
- 持续基准测试:跟踪性能变化趋势
警报和SLO
- 基于P99延迟的警报:设置有意义的阈值
- 警报降噪:减少误报和警报疲劳
- SLO定义:建立清晰的性能目标
- 自动修复:从警报到自动化响应的演进
置信区间和统计考虑
在处理P99延迟时,我们还需要考虑统计的可靠性。
样本大小的影响。当我们从大数据集中抽取样本时,样本的P99可能与整体数据集的P99不同。样本越大,估计越精确。
P99的置信区间(CI) 是包含真实分布P99的值的范围,具有预定义的置信度。
例如,如果[a, b]是80%置信度的CI,意味着用相同方法构建的80%的CI都将包含真实的分布P99。
实际应用建议
- 大数据集:当有大量延迟记录时,可以直接报告样本P99
- 小数据集:需要构建置信区间来表示不确定性
- 持续监控:随着数据积累,估计会越来越准确
参考:
Mastering Latency Metrics: P90, P95, P99
What’s the P99 Latency?
4 Tips to Improve P99 Latency
相关文章:
P99延迟:系统性能优化的关键指标
理解P99延迟 当谈论系统性能时,延迟指标扮演着至关重要的角色。其中,P99延迟作为最重要的性能指标之一,能够帮助我们识别系统的性能瓶颈,优化用户体验。 构建一个功能完善的后端系统,通过了所有功能测试,准…...
人工智能、机器人最容易取哪些体力劳动和脑力劳动
人工智能、机器人最容易取哪些体力劳动和脑力劳动 人工智能和机器人的发展可以替代人类简单的体力劳动和脑力劳动,但很难替代复杂的体力劳动和脑力劳动。 肌肉收缩的原理和运动特点 人类的体力劳动是靠肌肉的收缩完成的,其工作原理是肌肉内的肌球蛋白…...
【代码解析】opencv 安卓 SDK sample - 1 - HDR image
很久没有写安卓了,复习复习。用的是官方案例,详见opencv-Android-sdk 包 // 定义包名,表示该类的组织路径 package org.opencv.samples.tutorial1;// 导入所需的OpenCV和Android类库 import org.opencv.android.CameraActivity; // OpenCV…...
管理综合知识点
比与比例涉及的问题 比与比例基础知识比例的转换正反比例浓度问题利润问题增长率问题比例与面积行程问题 一、比例转换与性质 核心公式: 若 a : b c : d a:b c:d a:bc:d或 a b c d \frac{a}{b} \frac{c}{d} badc → a d b c ad bc adbc(交…...
机器学习:特征向量与数据维数概念
特征向量与数据维数概念 一、特征向量与维数的定义 特征向量与特征类别 在机器学习和数据处理中,每个样本通常由多个特征(Feature) 描述。例如,一张图片的特征可能包括颜色、形状、纹理等;一个客户的特征可能包括年龄…...
《情感反诈模拟器》2025学习版
1.2 专业内容支持 67篇情感诈骗案例研究14万字心理学分析资料783条专业配音对白 二、安装与运行 2.1 系统要求 最低配置: 显卡:GTX 1060CPU:i5-8400存储:25GB空间 2.2 运行步骤 解压游戏文件(21.7GB)…...
C++ - 标准库之 <string> npos(npos 概述、npos 的作用)
一、std::string::npos 概述 std::string::npos 是一个静态常量,表示 size_t 类型的最大值 std::string::npos 用于表示字符串操作中的未找到的位置或无效位置 std::string::npos 属于 C 标准库中的 <string> 头文件 二、std::string::npos 的作用 std::s…...
策略设计模式
1. 什么是策略模式 策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户端,客户端中的具体实现只需要了解上下文类。 2. 由什么组成 策略接口&…...
C++结构体初始化与成员函数实现语法详解
C结构体初始化与成员函数实现语法详解 一、结构体静态成员初始化语法 在C中,静态成员变量需要在类外部进行定义和初始化。提供的代码展示了如何为MAIN_PROPULSION_CAN类的静态成员变量进行初始化: MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPU…...
第八章 网络安全
1 什么是网络安全 安全通信具有的性质: 机密性:只有发送方和希望的接收方能否理解传输的报文内容(发送方加密报文,接收方解密报文)认证(端点鉴别):发送方和接收方需要确认对方的身…...
开源 python 应用 开发(一)python、pip、pyAutogui、python opencv安装
最近有个项目需要做视觉自动化处理的工具,最后选用的软件为python,刚好这个机会进行系统学习。短时间学习,需要快速开发,所以记录要点步骤,防止忘记。 链接: 开源 python 应用 开发(一&#x…...
CMCC RAX3000M nand版 OpenWrt 可用空间变小的恢复方法
文章目录 问题背景尝试一、通过 Tftpd64 重新刷写 initramfs-recovery 镜像 (不成功)尝试二、重新分配 ubi 卷(此操作存在一定的危险,请查阅相关资料,避免影响到核心分区) 问题背景 CMCC RAX3000M Nand 版…...
云函数调测、部署及日志查看
1、调试云函数 业务函数开发完成后,需要验证函数代码的正确性,DevEco Studio工具支持本地调用和远程调用两种形式的调试函数方法,首先来看看通过本地调用方式调试函数。 1)通过本地调用方式调试云函数 为了验证函数的正确性以及…...
逆向某物 App 登录接口:还原 newSign 算法全流程
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ newSign 参数分析 通过 Hook Java 层加密算法得到 newSign 参数相关信息如下: 具体参考:逆向某物 App 登录接口:抓包分析…...
2140、解决智力问题
题目 解答 正向不好做,反向遍历。 定义:dp[i] [i,n)的分数 初始化:dp[n]0 递推:dp[i]max(dp[i1],questions[i][0]dp[iquestions[i][1]1]) 如果越界了,就截断到dp[n] 最后return dp[0]即可 class Solution { publ…...
肖臻《区块链技术与应用》第六讲:比特币网络
一、分层架构:应用层之下的P2P网络 比特币并非凭空运作,它的协议运行在互联网的应用层之上。而在其底层,支撑整个系统的是一个对等网络(Peer-to-Peer, P2P)。可以这样理解: 应用层 (Application Layer): …...
(C++)素数的判断(C++教学)(C语言)
源代码: #include <iostream> using namespace std;int fun(int num){if(num<1){return 1;}if(num%20){return 0;}else{return 2;} }int main(){while (1){int y0;int num0;cout<<"请输入一个整数:\n";cin>>num;yfun(nu…...
openai-agents实现input_guardrails
目录 版本模块引入自定义LLM模型input_guardrail设置main函数 代码: input_guardrails.ipynb 版本 import agents print(agents.__version__)0.0.19模块引入 from __future__ import annotationsfrom pydantic import BaseModelfrom agents import (Agent,Guardr…...
在高数中 导数 微分 不定积分 定积分 的意义以及联系
在高等数学中,导数、微分、不定积分、定积分是微积分的核心概念,它们既有明确的定义和几何/物理意义,又相互关联。下面分别说明它们的意义,并总结它们之间的联系。 导数的意义 定义: 函数 y f(x) 在点 x 处的导数定义…...
Linux系统基本操作指令
Linux系统基本操作指令 文章目录 Linux系统基本操作指令一、介绍二、基础设置2.1 设置ubuntu与window的共享目录2.2 ubuntu系统简单介绍 三、Linux命令及工具介绍3.1 目录管理命令(功能,格式,参数,系统参数)3.2 文件操作命令 四、网络命令4.1…...
「Linux文件及目录管理」vi、vim编辑器
知识点解析 vi/vim编辑器简介 vi:Linux默认的文本编辑器,基于命令行操作,功能强大。vim:vi的增强版,支持语法高亮、多窗口编辑、插件扩展等功能。vi/vim基本模式 命令模式:默认模式,用于移动光标、复制、粘贴、删除等操作。插入模式:按i进入,用于输入文本。末行模式:…...
等等等等等等
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 …...
JAVA集合篇--深入理解ConcurrentHashMap图解版
一、前言 在Java并发编程中,线程安全的Map实现一直是一个重要话题。虽然我们可以使用Collections.synchronizedMap()或者HashTable来获得线程安全的Map,但它们的性能在高并发场景下往往不尽人意。ConcurrentHashMap作为Java并发包中的重要组件࿰…...
Python嵌套循环
一、前言 在 Python 编程中,嵌套循环(Nested Loops) 是指在一个循环的内部再嵌套另一个循环。这种结构常用于处理多维数据结构(如二维数组、矩阵)、遍历组合数据、图形绘制等场景。 虽然嵌套循环在逻辑上更复杂&…...
linux编译安装nginx
1.到官网(nginx)下载nginx压缩包: 2.以(nginx-1.24.0.tar.gz)为例: 1.上传压缩包至linux服务器: rz 2.解压压缩包nginx-1.24.0.tar.gz: tar -zxvf nginx-1.24.0.tar.gz 3.在安装Nginx之前,需…...
算法-动态规划-钢条切割问题
钢条切割问题是一个经典的动态规划问题,旨在通过切割钢条获得最大收益。以下是详细解释和解决方案: 问题描述 给定长度为 n 的钢条和价格表 p,其中 p[i] 表示长度为 i 的钢条的价格(i 1, 2, ..., n)。目标ÿ…...
Java八股文——系统场景设计
如何设计一个秒杀场景? 面试官您好,设计一个秒杀系统,是对一个工程师综合技术能力的巨大考验。它的核心挑战在于,如何在极短的时间内,应对超高的并发请求,同时保证数据(尤其是库存)…...
如何在FastAPI中玩转GitHub认证,让用户一键登录?
title: 如何在FastAPI中玩转GitHub认证,让用户一键登录? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: cmdragon excerpt: GitHub第三方认证集成通过OAuth2.0授权码流程实现,包含用户跳转GitHub认证、获取授权码、交换访问令牌及调用API获取用户信息四…...
[RPA] 影刀RPA实用技巧
1.给数字添加千分位分隔符 将变量variable的数值(2025.437)添加千分位分隔符,使其变为2,025.437 流程搭建: 关键指令: 2.删除网页元素 将bilibili官网的"动态"图标进行删除 流程搭建: 关键指令: 呈现效果…...
RA4M2开发IOT(7)----RA4M2驱动涂鸦CBU模组
RA4M2开发IOT.7--RA4M2驱动涂鸦CBU模组 概述视频教学样品申请硬件准备参考程序初始化 LSM6DSV16X 传感器初始化单双击识别主程序接口RA4M2接口生成UARTUART属性配置R_SCI_UART_Open()函数原型回调函数user_uart_callback0 ()变量定义更新敲击状态DP同步长按进入配网涂鸦协议解析…...
华为公布《鸿蒙编程语言白皮书》V1.0 版:解读适用场景
6 月 22 日消息,华为现已在其开发者网站上架《鸿蒙编程语言白皮书》V1.0 版本,主要围绕鸿蒙 HarmonyOS 整体框架、适用场景、演进策略、未来愿景四大角度进行阐述,文档访问地址(https://developer.huawei.com/consumer/cn/doc/gui…...
多源异构数据接入与实时分析:衡石科技的技术突破
在数字化转型的浪潮中,企业每天产生的数据量呈指数级增长。这些数据来自CRM系统、IoT设备、日志文件、社交媒体、交易平台等众多源头,格式各异、结构混乱、流速不一。传统的数据处理方式如同在无数孤立的岛屿间划着小船传递信息,效率低下且无…...
多设备Obsidian笔记同步:WebDAV与内网穿透技术高效实现教程
文章目录 前言1. Windows开启Webdav服务2. 客户端测试3. 安装Cpolar内网穿透实现公网访问Webdav4. 同步PC端笔记至WebDav4.1 首先需要在IIS中添加md的格式4.2 在Obsidian中安装第三方插件 5. 同步手机端笔记至WebDav 前言 各位好!在数字化浪潮席卷的当下࿰…...
Linux->进程概念(精讲)
引入:本文会讲到的东西有哪些? 注:要讲就讲清楚,所以从0到懂,目录在右侧 一:冯诺依曼体系结构 1:人物介绍 冯诺依曼是一个伟大的人,他提出了一个体系结构,被命名冯诺依…...
【舞蹈】PC-Dance:姿势可控的音乐驱动舞蹈合成
PC-Dance:姿势可控的音乐驱动舞蹈合成 自监督节奏对齐学习音乐到舞蹈的对齐嵌入-PC-Syn 中,依然怒了一种用于 自适应运动图构建(AMGC)的高效方案,可以基于图的优化效率并保持动作的多样性。 舞蹈合成 整体情况 我们的系统主要由音乐到舞蹈对齐嵌 入网络(M2D-Align)和姿势…...
uni-app项目实战笔记22--图片预览和切换
需求描述: 1、图片预览时,通常需要知道,当前预览的是第几张,总共有多少张图片; 2、当用户左右滑动切换预览图片时,当前预览索引需要随着进行切换。 下面简单介绍下实现过程: 1、在图片列表页…...
[特殊字符] AIGC工具深度实战:GPT与通义灵码如何彻底重构企业开发流程
🔍 第一模块:理念颠覆——为什么AIGC不是“玩具”而是“效能倍增器”? ▍企业开发的核心痛点图谱(2025版) 研发效能瓶颈:需求膨胀与交付时限矛盾持续尖锐,传统敏捷方法论已触天花板…...
华为OD机考-用户调度问题-DP(JAVA 2025B卷)
import java.util.Scanner;public class UserScheduling {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt(); // 用户个数int[][] costs new int[n][3]; // 存储每个用户使用A/B/C策略的系统消耗for (int i 0; i …...
【论文阅读 | CVPR 2024 |Fusion-Mamba :用于跨模态目标检测】
论文阅读 | CVPR 2024 |Fusion-Mamba :用于跨模态目标检测 1.摘要&&引言2.方法2.1 预备知识2.2 Fusion-Mamba2.2.1 架构特征提取与多模态融合(FMB模块)FMB的应用与输出2.2.2 关键组件3.2.2.1 SSCS 模块:浅层跨模态特征交互…...
Python 数据分析与可视化 Day 4 - Pandas 数据筛选与排序操作
🎯 今日目标 掌握 Pandas 中 groupby() 的使用方式学会使用 agg() 方法进行多个聚合掌握 pivot_table() 构建透视表结合分组与排序进行更深入的分析 🧮 一、基本分组统计(groupby) ✅ 分组 单列聚合 df.groupby("性别&qu…...
基于Vue.js的图书管理系统前端界面设计
一、系统前端界面设计要求与效果 (一)系统功能结构图 设计一个基于Vue.js的图书管理系统前端界面。要充分体现Vue的核心特性和应用场景,同时结合信息管理专业的知识。要求系统分为仪表盘、图书管理、借阅管理和用户管理四个主要模块&#x…...
FPGA故障注入测试软件使用指南
有数字芯片之母别称的FPGA,是国内在半导体行业率先取得重大突破的细分赛道,正迎来技术和市场形成共振的黄金发展期。 国内拥有最多的应用设计工程师与新兴从业人员,但到目前为止,还没有一款位流级别的专用EDA软件,服务用户日常应用开发所需的调试验证工作。 第一大厂商赛…...
Oracle 数据库查询:单表查询
作者:IvanCodes 日期:2025年6月22日 专栏:Oracle教程 在 Oracle 数据库操作中,查询数据是最频繁、最核心的操作之一。单表查询,即仅从一个表中检索信息,是所有复杂查询的基础。本笔记将系统梳理单表查询的关…...
【DDD】——带你领略领域驱动设计的独特魅力
🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大三学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL࿰…...
阿里云CentOS系统搭建全攻略:开启云端技术之旅
前期准备:开启云端征程前的必备事项 在当今数字化时代,云计算已成为企业和开发者构建应用和服务的重要基础设施。阿里云作为全球领先的云计算服务提供商,提供了丰富的云计算产品和服务,其中 CentOS 系统在阿里云上的应用非常广泛…...
Flink图之间流转解析:从逻辑构建到物理执行的深度剖析
在Flink强大的数据处理体系中,Table Connectors实现了与外部结构化数据的高效交互,而Flink作业从代码到实际执行的背后,是各类图结构之间的流转与转换。这些图结构承载着作业的逻辑定义、任务划分与资源调度等关键信息,其流转过程…...
详解Redis数据库和缓存不一致的情况及解决方案
数据库与缓存不一致是分布式系统中常见问题,本质是数据在缓存层和存储层出现版本差异。 一、并发写操作导致不一致(最常见) 场景描述 线程A更新数据库 → 线程B更新数据库 → 线程B更新缓存 → 线程A更新缓存 结果:缓存中存储的…...
【CSS】CSS3媒体查询全攻略
媒体查询教程 媒体查询(Media Queries)是CSS3中引入的强大功能,允许内容根据设备特性(如屏幕尺寸、分辨率、方向等)进行自适应调整。以下是媒体查询的详细教程: 基本语法 media mediatype and (media feature) {/* CSS规则 */ }常用媒体类型 all - 所…...
深入理解Spring的ResponseBodyAdvice接口
什么是ResponseBodyAdvice? ResponseBodyAdvice是Spring框架4.2版本引入的一个非常有用的接口,它允许我们在控制器方法执行后、响应体写入前对响应进行统一处理。这个接口为开发者提供了对返回数据进行统一拦截和修改的能力,是Spring MVC响应处理流程中…...
C++法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。
C法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。 在 C 中,法则5指的是:当函数参数是非引用类型(即按值传递)时,传递给函数的实参会进行拷贝初始化(copy initializ…...