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

网站缓存入门与实战:浏览器与Nginx/Apache服务器端缓存,让网站速度起飞!(2025)

更多服务器知识,尽在hostol.com

嘿,各位站长和网站管理员朋友们!咱们精心打造的网站,内容再好,设计再炫,如果用户打开它的时候,加载速度慢得像“老牛拉破车”,那体验可就大打折扣了,说不定用户等不及就直接“拜拜”了。除了拥有给力的服务器硬件和优化的代码,还有一个能让你网站速度“原地起飞”的“魔法秘籍”——那就是缓存(Caching)!是不是听起来有点玄乎?别急,今天Hostol就来当一回“魔法导师”,带你揭开“浏览器缓存”和“服务器端页面缓存”这两大“加速咒语”的神秘面纱,并手把手教你怎么在Nginx和Apache上施展它们,让你的网站也能拥有风驰电掣般的速度!


缓存是个啥?—— 省时省力的“记忆大师”

在聊具体的“魔法咒语”之前,咱们先得明白,“缓存”这位“记忆大师”到底是何方神圣。简单来说,缓存就是把一些经常被访问的、或者生成起来比较费劲的数据,预先存放在一个更容易获取的地方(比如用户的浏览器里,或者服务器的内存/硬盘上),当下次再需要这些数据时,就可以直接从这个“快捷通道”取用,而不用每次都辛辛苦苦地重新去“源头”(比如服务器深处、数据库)获取或生成一遍。

想象一下,你去图书馆借一本超级热门的书:

  • 没有缓存: 图书管理员每次都得从最里面的书库(源服务器/数据库)把书给你找出来,效率低下。
  • 有了缓存: 图书管理员发现这本书太火了,就直接在咨询台(缓存区)放了几本复印件或者原书。你一来,直接从咨询台拿走,是不是快多了?

网站缓存的原理也是如此,目的就是为了:减少等待时间,降低服务器压力,提升用户体验! 咱们主要聊两种最常用也最有效的缓存魔法:浏览器缓存和服务器端页面缓存。


第一重魔法:浏览器缓存 —— 给访客的“极速重逢”体验

浏览器缓存,顾名思义,就是让访问你网站的用户,他们的浏览器把一些不常变化的“静态资源”(比如你网站的Logo图片、CSS样式表、JavaScript脚本文件等)在第一次访问时就“下载并保存”到用户自己的电脑上。

这样,当这位用户再次访问你的网站,或者访问你网站的其他页面时,如果又需要用到这些已经“存好”的资源,浏览器就可以“就地取材”,直接从本地硬盘加载,而不用眼巴巴地再从你的服务器上重新下载一遍。这感觉,就像是老朋友重逢,不用过多寒暄,默契十足,自然神速!

施法道具:HTTP响应头里的“缓存咒语”

浏览器听不听话,肯不肯缓存你的资源,以及缓存多久,主要就靠你(的服务器)在HTTP响应头里下达的“缓存指令”了。常用的“咒语”有:

  • Expires (过期时间): 这是个比较老的“咒语”,它直接告诉浏览器这个资源在某个具体的“绝对时间点”(比如:Expires: Wed, 28 May 2025 12:00:00 GMT)之前都有效,可以大胆用缓存。但它的问题在于,服务器和客户端的时间可能不同步,导致判断失误。
  • Cache-Control (缓存控制): 这是更现代、更强大也更灵活的“主控咒语”,优先级也比Expires高。它有很多“法术变种”:
    • max-age=<秒数>:告诉浏览器这个资源从现在开始,在多少秒内都是新鲜的,可以直接用缓存。比如Cache-Control: max-age=31536000(缓存一年)。这是最常用的!
    • public:表明响应可以被任何缓存(包括用户的浏览器、CDN节点、代理服务器等)缓存。
    • private:表明响应只能被用户的浏览器缓存,中间的代理服务器不能存。
    • no-cache:并不是“不缓存”的意思!而是说浏览器可以用本地缓存,但在用之前,必须先去服务器那里“打个招呼”(发送一个验证请求,比如带上If-None-MatchIf-Modified-Since头部),问问服务器这个缓存还能不能用。如果服务器说“能用”(返回304 Not Modified状态码),浏览器才用缓存;否则就得下载新的。
    • no-store:这才是真正的“雁过拔毛,不留痕迹”——完全禁止浏览器和任何中间缓存存储这个响应的任何部分。通常用于涉及敏感信息的页面。
  • ETag (实体标签) 与 Last-Modified (最后修改时间): 这两位是Cache-Control: no-cache的“好搭档”,用来做缓存验证。
    • Last-Modified:服务器告诉浏览器这个资源上次是啥时候改的。浏览器下次请求时会带上If-Modified-Since头部问:“这玩意儿从我上次看的时间点之后,你改过没?”
    • ETag:服务器给资源生成的唯一“指纹”。浏览器下次请求时会带上If-None-Match头部问:“这资源的‘指纹’还是不是这个?”
    如果服务器判断资源没变,就返回一个超轻量的304 Not Modified响应,告诉浏览器“放心用你本地的缓存吧!”,连文件本体都不用传了,是不是超省流量?

“咒语”怎么念?—— Nginx与Apache配置实例

通常,我们对不常变化的静态资源(图片、CSS、JS)设置较长的缓存时间。

Nginx配置示例 (在server块或特定location块中添加):

location ~* \.(?:jpg|jpeg|gif|png|ico|css|js|svg|woff|woff2)$ {expires 30d; # 缓存30天 (这会自动添加Cache-Control: max-age和Expires头部)add_header Cache-Control "public, no-transform"; # 明确指定为public,并禁止代理服务器修改内容access_log off; # 可选:关闭这些静态资源的访问日志记录,减轻日志压力log_not_found off; # 可选:找不到这些静态资源时不记录错误日志
}

Apache配置示例 (需要启用mod_expires模块,通常在.htaccess文件或虚拟主机配置中添加):

&lt;IfModule mod_expires.c&gt;ExpiresActive OnExpiresByType image/jpeg "access plus 1 month"ExpiresByType image/png "access plus 1 month"ExpiresByType image/gif "access plus 1 month"ExpiresByType image/ico "access plus 1 month"ExpiresByType text/css "access plus 1 month"ExpiresByType application/javascript "access plus 1 month"ExpiresByType application/x-javascript "access plus 1 month"ExpiresByType image/svg+xml "access plus 1 month"ExpiresByType application/font-woff "access plus 1 year"ExpiresByType application/font-woff2 "access plus 1 year"
&lt;/IfModule&gt;&lt;IfModule mod_headers.c&gt;&lt;FilesMatch "\.(jpe?g|png|gif|ico|css|js|svg|woff2?)$"&gt;Header set Cache-Control "public, max-age=2592000, no-transform"# max-age=2592000 秒约等于30天&lt;/FilesMatch&gt;
&lt;/IfModule&gt;

“旧貌换新颜”的难题:缓存更新(Cache Busting)

浏览器缓存虽好,但如果你的CSS或JS文件更新了,用户浏览器里还存着旧版本的缓存,那看到的可能就是“穿越”的样式或者出错的功能了。怎么让浏览器知道该去下载新文件呢?这就是“缓存破坏”或“缓存刷新”(Cache Busting)技术了。常见方法有:

  • 文件名加版本号: 比如把style.css改成style.v1.2.css。文件名变了,浏览器自然会把它当成新资源去下载。很多前端构建工具会自动帮你做这个。
  • URL后加查询参数: 比如style.css?version=1.2。但要注意,有些代理服务器可能会忽略查询参数而继续提供旧缓存。所以文件名版本号通常更可靠。


第二重魔法:服务器端页面缓存 —— 给服务器“减负提神”

浏览器缓存主要针对的是静态资源,而且只对用户的“第二次访问”有效。那对于那些动态生成的页面(比如PHP程序从数据库里查出来的数据组成的页面),用户第一次访问时,服务器是不是还得辛辛苦苦地执行一遍PHP、查一遍数据库呢?如果这个页面内容不经常变,或者对于所有未登录用户看到的内容都一样,那我们能不能让服务器也“偷偷懒”,把第一次生成好的HTML页面“存个档”,下次再有用户访问同一个页面,直接把这个“存档”扔给他,省去中间那一堆复杂的计算过程呢?

当然可以!这就是服务器端页面缓存的魔力! 它就像是餐厅把最畅销的几道菜提前做好一份“样板菜”放在保温箱里,有客人点这道菜,直接端上去,速度杠杠的!

常见的“施法”流派:

A. Web服务器自带“法术”(Nginx/Apache级别缓存)

Nginx FastCGI Cache (针对PHP-FPM等FastCGI应用):

Nginx的fastcgi_cache模块是个非常强大的工具,能把PHP-FPM(或其他FastCGI应用)处理完的动态页面结果缓存起来。

简单配置步骤(在http块定义缓存路径和参数,在server块或location块中启用):

1. 在nginx.confhttp块中定义缓存区域:

http {# ...其他http配置...fastcgi_cache_path /var/nginx/cache levels=1:2 keys_zone=MYAPPCACHE:100m inactive=60m max_size=10g;# /var/nginx/cache: 缓存文件存放路径,确保Nginx运行用户有权限读写# levels=1:2: 缓存目录层级结构# keys_zone=MYAPPCACHE:100m: 缓存键和元数据存放的共享内存区域名和大小# inactive=60m: 60分钟内未被访问的缓存将被清理# max_size=10g: 最大缓存空间fastcgi_cache_key "$scheme$request_method$host$request_uri"; # 定义缓存的唯一键fastcgi_ignore_headers Cache-Control Expires Set-Cookie; # 忽略这些来自后端的头部,自己控制缓存
}

2. 在处理PHP的location块中启用缓存:

location ~ \.php$ {# ...其他fastcgi配置...include fastcgi_params;fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 你的PHP-FPM地址fastcgi_cache MYAPPCACHE; # 使用上面定义的缓存区域fastcgi_cache_valid 200 301 302 60m; # 对200,301,302状态码的响应缓存60分钟fastcgi_cache_valid any 1m; # 其他状态码缓存1分钟fastcgi_cache_use_stale error timeout invalid_header http_500 http_503; # 后端出错时可使用过期缓存fastcgi_cache_bypass $skip_cache; # 定义一些不走缓存的条件add_header X-Cache-Status $upstream_cache_status; # 在响应头里加个缓存状态,方便调试 (HIT, MISS, BYPASS, EXPIRED)
}

Apache mod_cache (配合mod_cache_diskmod_cache_socache):

Apache也有类似的缓存模块,比如mod_cache配合mod_cache_disk可以将内容缓存到磁盘。配置相对Nginx来说,在某些场景下可能稍显复杂一些,但也能实现类似效果。

需要在httpd.conf或虚拟主机配置中加载模块并进行配置:

&lt;IfModule mod_cache.c&gt;&lt;IfModule mod_cache_disk.c&gt;CacheEnable disk /CacheRoot "/var/cache/apache2/mod_cache_disk"CacheDirLevels 2CacheDirLength 1CacheDefaultExpire 3600  # 默认缓存1小时CacheMaxFileSize 1000000 # 最大缓存1MB的文件&lt;/IfModule&gt;
&lt;/IfModule&gt;

(注意:以上只是极简示例,实际生产环境配置会更复杂,需要仔细阅读官方文档并进行测试。)

B. 应用层缓存“法宝”(如WordPress缓存插件)

对于很多流行的CMS(内容管理系统)如WordPress,有大量优秀的缓存插件(如WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache等)。它们通常更容易上手,点几下鼠标就能开启页面缓存(通常是生成静态HTML文件)、对象缓存(把数据库查询结果等缓存到内存,如Redis/Memcached)等功能。对于不太懂服务器配置的用户来说,这是个不错的选择。

C. 反向代理缓存“大神”(如Varnish Cache, 或Nginx自身)

更高级的玩法是使用专门的反向代理缓存服务器,比如大名鼎鼎的Varnish Cache。它部署在你的Web服务器前端,专门负责缓存和快速响应用户请求,性能极高。Nginx本身也可以配置为强大的反向代理缓存服务器,缓存来自后端应用服务器(比如Tomcat, Node.js应用)的响应。

“魔法失效”的时刻:缓存清除/失效(Cache Invalidation)

缓存虽好,但如果你的网站内容更新了(比如发了一篇新博客,改了一个产品价格),用户看到的还是旧的缓存内容,那可就麻烦了。所以,“如何让缓存及时失效并更新”就成了缓存策略中的核心难题之一(甚至被称为“计算机科学两大难题之一”,另一个是命名规范)。

常见的缓存清除策略有:

  • 基于时间的失效: 就是我们前面配置的expires, max-age, fastcgi_cache_valid,到期自动失效。简单粗暴,但可能不够及时。
  • 事件驱动的清除: 当内容更新时,主动触发一个动作去清除相关的缓存。比如,WordPress的缓存插件在你发布或修改文章后,会自动清除对应页面的缓存。对于Nginx FastCGI Cache,有一些第三方模块(如ngx_cache_purge)或脚本可以实现按需清除。


双重魔法叠加:浏览器缓存 + 服务器端缓存 = 效果拔群!

浏览器缓存和服务器端缓存并不是“二选一”的关系,它们完全可以(也应该)协同工作,发挥“1+1 > 2”的魔力!

  • 服务器端页面缓存: 负责减轻你服务器的压力,让服务器能更快地响应那些可以被缓存的页面请求(尤其是对于第一次访问该页面的用户,或者缓存已过期的用户)。
  • 浏览器缓存: 负责让用户的浏览器“记住”那些不常变的静态资源。当用户再次访问,或者访问使用了相同静态资源的其他页面时,直接从本地加载,连服务器都不用麻烦了,速度自然快上加快!

一个典型的流程可能是:用户请求页面 -> CDN(如果有)提供缓存 -> 服务器端缓存提供页面 -> 应用服务器动态生成页面 -> 浏览器缓存静态资源。


施展“缓存魔法”的小贴士:

  • 静态资源大胆缓存: 图片、CSS、JS这些不常变的东西,尽管给它们设置超长的浏览器缓存时间(比如一年),然后用文件名版本号或查询参数来控制更新。
  • 匿名用户页面重点缓存: 对于未登录用户看到的、内容基本一致的页面(如文章页、列表页),服务器端页面缓存的效果最好。
  • 动态个性化内容慎重缓存: 对于包含用户私人信息(如购物车、已登录状态下的用户中心)的页面,服务器端页面缓存要非常小心,甚至不缓存,或者采用更复杂的“片段缓存”(ESI等)技术。
  • 测试!测试!再测试! 实施任何缓存策略后,务必彻底测试网站的各项功能,并通过浏览器开发者工具检查HTTP响应头,确认缓存规则是否按预期工作。
  • 监控缓存命中率: 了解你的缓存到底有多大效果,命中率高不高,是持续优化的重要依据。


哇哦!是不是感觉“缓存”这个“魔法”也没那么遥不可及了?无论是让用户的浏览器“长点记性”,还是让你的服务器“学会偷懒”,核心目的都是为了让我们的网站像装了“飞行马靴”一样,轻盈、迅捷!虽然配置缓存可能需要你花点时间去研究和测试,但一旦调校得当,它给你的网站性能带来的提升,绝对会让你觉得“物超所值”!Hostol希望这篇“缓存魔法入门与实战”能为你打开一扇通往极致网站速度的大门。赶紧去给你的网站也施展一下这些“加速咒语”吧!

相关文章:

网站缓存入门与实战:浏览器与Nginx/Apache服务器端缓存,让网站速度起飞!(2025)

更多服务器知识&#xff0c;尽在hostol.com 嘿&#xff0c;各位站长和网站管理员朋友们&#xff01;咱们精心打造的网站&#xff0c;内容再好&#xff0c;设计再炫&#xff0c;如果用户打开它的时候&#xff0c;加载速度慢得像“老牛拉破车”&#xff0c;那体验可就大打折扣了…...

mysql-mysql源码本地调试

前言 先进行mysql源码本地编译&#xff1a;mysql源码本地编译 1.本地调试 这里以macbook为例 1.使用vscode打开mysql源码 2.创建basedir目录、数据目录、配置文件目录、配置文件 cd /Users/test/ mkdir mysqldir //创建数据目录和配置目录 cd mysqldir mkdir conf data …...

PCIe— Legacy PCI

Legacy Model ​​ 该器件通过将其引脚置位到控制器来生成中断。 在较旧的系统中&#xff0c;这个控制 器通常是Intel 8259 PIC&#xff0c;有15个IRQ输入和一个INTR输出。 然后&#xff0c;PIC将断 言INTR以通知CPU一个或多个中断正在挂起。 一旦CPU检测到INTR的断言…...

PostgreSQL数据库配置SSL操作说明书

背景&#xff1a; 因为postgresql或者mysql目前通过docker安装&#xff0c;只需要输入主机IP、用户名、密码即可访问成功&#xff0c;这样其实是不安全的&#xff0c;可能会通过一些手段获取到用户名密码导致数据被窃取。而ES、kafka等也是通过用户名/密码方式连接&#xff0c;…...

MySQL 的 super_read_only 和 read_only 参数

MySQL 的 super_read_only 和 read_only 参数 一、参数基本概念 1. read_only 参数 作用&#xff1a;控制普通用户是否只能读取数据影响范围&#xff1a;所有非SUPER权限的用户默认值&#xff1a;OFF&#xff08;可读写&#xff09; 2. super_read_only 参数 作用&#xf…...

低碳理念在道路工程中的应用-预制路面

一、引子 在上一篇文章里&#xff0c;给大家介绍了预制基层的应用&#xff0c;有人提出&#xff0c;既然基层能够预制&#xff0c;那么&#xff0c;道路面层能不能预制呢&#xff0c;有没有相关的研究成果和应用实例呢&#xff1f;答案是肯定的&#xff0c;在本篇文章中&#x…...

12-后端Web实战(登录认证)

在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。最终要实现的效果是&#…...

TIDB创建索引失败 mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory.

TIDB创建索引失败&#xff1a;解决“mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory”问题 在使用 TIDB 数据库时&#xff0c;我们有时会遇到创建索引失败的问题。常见的错误信息为&#xff1a; mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directo…...

Redis 插入中文乱码键

Java 代码&#xff1a; Bean// 静态代理模式: Redis 客户端代理类增强public StringRedisTemplateProxy stringRedisTemplateProxy(RedisKeySerializer redisKeySerializer,StringRedisTemplate stringRedisTemplate,RedissonClient redissonClient) {stringRedisTemplate.setK…...

Mac OS 使用说明

Mac 的启动组合键 了解可通过在启动时按住一个或多个按键来访问的 Mac 功能和工具。 若要使用这些组合键中的任何一个&#xff0c;请在按下电源按钮以开启 Mac 后或在 Mac 开始重新启动后&#xff0c;立即按住相应按键。请一直按住&#xff0c;直至电脑出现对应的行为。 !!!上…...

4.2.2 Spark SQL 默认数据源

在本实战概述中&#xff0c;我们探讨了如何在 Spark SQL 中使用 Parquet 格式作为默认数据源。首先&#xff0c;我们了解了 Parquet 文件的存储特性&#xff0c;包括其二进制存储方式和内嵌的 Schema 信息。接着&#xff0c;通过一系列命令&#xff0c;我们演示了如何在 HDFS 上…...

234. Palindrome Linked List

目录 一、题目描述 方法一、使用栈 方法二、将链表全部结点值复制到数组&#xff0c;再用双指针法 方法三、递归法逆序遍历链表 方法四、快慢指针反转链表 一、题目描述 234. Palindrome Linked List 方法一、使用栈 需要遍历两次。时间复杂度O(n)&#xff0c;空间复杂度…...

广州邮科高频开关电源:以创新科技赋能通信能源绿色未来

在数字化浪潮席卷全球的当下&#xff0c;通信网络作为信息社会的基石&#xff0c;其稳定运行对电源系统的可靠性、效率及智能化水平提出了更高要求。作为国内通信电源领域的领军企业&#xff0c;广州邮科凭借其自主研发的高频开关电源技术&#xff0c;以高效节能、智能管控、绿…...

day41 python图像识别任务

目录 一、数据预处理&#xff1a;为模型打下坚实基础 二、模型构建&#xff1a;多层感知机的实现 三、训练过程&#xff1a;迭代优化与性能评估 四、测试结果&#xff1a;模型性能的最终检验 五、总结与展望 在深度学习的旅程中&#xff0c;多层感知机&#xff08;MLP&…...

无人机报警器探测模块技术解析!

一、运行方式 1. 频谱监测与信号识别 全频段扫描&#xff1a;模块实时扫描900MHz、1.5GHz、2.4GHz、5.8GHz等无人机常用频段&#xff0c;覆盖遥控、图传及GPS导航信号。 多路分集技术&#xff1a;采用多传感器阵列&#xff0c;通过信号加权合并提升信噪比&#xff0c;…...

Docker 替换宿主与容器的映射端口和文件路径

在使用 Docker 容器化应用程序时&#xff0c;经常需要将宿主机的端口和文件路径映射到容器中&#xff0c;以便在本地访问容器中的服务和数据。本文将详细介绍如何替换和配置 Docker 容器的端口和文件路径映射。 1. 端口映射 端口映射用于将宿主机的端口转发到容器中的端口&am…...

我的3种AI写作节奏搭配模型,适合不同类型写作者

—不用内耗地高效写完一篇内容&#xff0c;原来可以这样搭配AI ✍️ 开场&#xff1a;为什么要“搭配节奏”写作&#xff1f; 很多人以为用AI写作&#xff0c;就是丢一句提示词&#xff0c;然后“等它写完”。 但你有没有遇到这些情况&#xff1a; AI写得很快&#xff0c;学境…...

Bonjour

Bonjour 是苹果的一套零配置网络协议&#xff0c;用于发现局域网内的其他设备并进行通信&#xff0c;比如发现打印机、手机、电视等。 一句话&#xff1a;发现局域网其他设备和让其他设备发现。 Bonjour 可以完成的工作 IP 获取名称解析搜索服务 实际应用场景示例&#xff0…...

华为云Flexus+DeepSeek征文 | 基于Dify和DeepSeek-R1开发企业级AI Agent全流程指南

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 环境准备 2.1 华为云资源准备 2.1 实…...

HarmonyOS-ArkUI固定样式弹窗(1)

固定样式弹窗指的就是ArkUI中为我们提供的一些具备界面模板性质的弹窗。样式是固定的,我们可以决定在这些模板里输入什么样的内容。常见的有,警告弹窗, 列表选择弹窗, 选择器弹窗,对话框,操作菜单。 下图是本文中要讲到的基类固定样式弹窗,其中选择器弹窗没有包含在内,…...

痉挛性斜颈相关内容说明

一、颈部姿态的异常偏移​ 痉挛性斜颈会打破颈部原本自然笔直的状态&#xff0c;让颈部像被无形的力量牵引&#xff0c;出现不自主的歪斜、扭转。它就像打乱了颈部原本和谐的 “平衡游戏”&#xff0c;使得颈部姿态偏离正常&#xff0c;影响日常的体态与活动。​ 二、容易察觉…...

C语言| 函数参数传递指针

C语言| 拷贝传递(指针控制内存单元)-CSDN博客 【函数参数传指针和传数据的区别】 如果希望在另外一个函数中修改本函数中变量的值&#xff0c;那么在调用函数时只能传递该变量的地址。 1 普通变量&#xff0c;传递它的地址&#xff0c;可以直接操作该变量的内存空间。 举例…...

【25-cv-05917】HSP律所代理Le Petit Prince 小王子商标维权案

Le Petit Prince 小王子 案件号&#xff1a;25-cv-05917 立案时间&#xff1a;2025年5月28日 原告&#xff1a;SOCIETE POUR LOEUVRE ET LA MEMOIRE DANTOINE DE SAINT EXUPERY - SUCCESSION DE SAINT EXUPERY-DAGAY 代理律所&#xff1a;HSP 原告介绍 《小王子》&#x…...

MyBatis 动态 SQL 详解:灵活构建强大查询

MyBatis 的动态 SQL 功能是其最强大的特性之一&#xff0c;它允许开发者根据不同条件动态生成 SQL 语句&#xff0c;极大地提高了 SQL 的灵活性和复用性。本文将深入探讨 MyBatis 的动态 SQL 功能&#xff0c;包括 OGNL 表达式的使用以及各种动态 SQL 元素&#xff08;如 if、c…...

从 “金屋藏娇” 到 自然语言处理(NLP)

文章目录 从两个问题理解自然语言处理&#xff08;NLP&#xff09;1、汉武帝喜欢阿娇吗1. 政治联姻的背景2. 早期情感与后期疏远3. 历史评价的复杂性4. 现代视角结论 2、刘彻和淮南王关系一、背景&#xff1a;诸侯王与中央的矛盾二、刘彻与刘安的互动三、深层原因与历史评价结论…...

vue3 ElMessage提示语换行渲染

在 ElMessage.error 中使用换行符 \n 并不会实现换行&#xff0c;因为 ElMessage 默认会将字符串中的换行符忽略。要实现换行显示&#xff0c;可以使用 HTML 标签 <br> 并结合 ElMessage 的 dangerouslyUseHTMLString 选项。以下是实现换行提示的代码示例&#xff1a; i…...

Java 微服务架构设计:服务拆分与服务发现的策略

Java 微服务架构设计&#xff1a;服务拆分与服务发现的策略 微服务架构作为一种热门的软件架构风格&#xff0c;在 Java 领域有着广泛的应用。它通过将系统拆分为一组小型服务来实现更灵活、可扩展的系统设计。在微服务架构中&#xff0c;服务拆分和服务发现是两个关键环节。本…...

华为OD机试真题——二叉树中序遍历(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《二叉树中序遍历》: 目录 …...

解决 Go 中 `loadinternal: cannot find runtime/cgo` 错误

在 Go 开发中&#xff0c;loadinternal: cannot find runtime/cgo 是一个相对不常见但可能令人困惑的错误。这个错误通常与 CGO 的使用和配置有关。本文将探讨这个错误的成因&#xff0c;并提供解决方案&#xff0c;帮助你在未来的开发中避免类似问题。 错误背景 在 Go 项目中…...

VSCode + GD32F407 构建烧录

前言 最近调试一块 GD32F407VET6&#xff08;168Mhz&#xff0c;8Mhz晶振&#xff09; 板子时&#xff0c;踩了一些“启动失败”的坑。本以为是时钟配置有误&#xff0c;最后发现是链接脚本&#xff08;.ld 文件&#xff09;没有配置好&#xff0c;导致程序根本没能正常执行 ma…...