Nginx 怎样处理请求的缓存数据清理策略?

news2024/9/21 10:49:09
  • 🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!

Nginx

文章目录

  • Nginx 怎样处理请求的缓存数据清理策略?
    • 一、理解 Nginx 缓存的重要性
    • 二、Nginx 缓存数据的类型
      • (一)静态文件缓存
      • (二)动态内容缓存
      • (三)代理缓存
    • 三、Nginx 缓存数据清理的触发条件
      • (一)缓存空间不足
      • (二)缓存数据过期
      • (三)后端数据更新
    • 四、Nginx 缓存数据清理策略
      • (一)LRU(Least Recently Used)策略
      • (二)LFU(Least Frequently Used)策略
      • (三)TTL(Time To Live)策略
      • (四)随机清理策略
    • 五、Nginx 缓存数据清理的配置示例
      • (一)LRU 策略配置
      • (二)LFU 策略配置
      • (三)TTL 策略配置
      • (四)随机清理策略配置
    • 六、实际应用中的优化与注意事项
      • (一)监控与分析
      • (二)考虑业务特点
      • (三)结合前端优化
      • (四)测试与验证
    • 七、总结

line

Nginx 怎样处理请求的缓存数据清理策略?

在当今快节奏的互联网世界中,网站的性能和响应速度对于用户体验至关重要。就好比在一场激烈的赛车比赛中,每一秒的提速都可能决定胜负,而 Nginx 就像是赛车的引擎优化器,能让网站的运行更加高效、流畅。其中,Nginx 对请求的缓存数据清理策略,更是提升性能的关键一环。这就好比我们日常生活中的整理房间,定期清理不需要的东西,才能让房间保持整洁有序,让我们能更轻松地找到所需之物。

一、理解 Nginx 缓存的重要性

想象一下,您正在经营一家繁忙的超市。每天有成千上万的顾客涌入,他们都在寻找各种商品。为了能够快速满足顾客的需求,您会在仓库中预先储备一些热门商品,这样当顾客需要时,就可以立即提供,而无需每次都从遥远的供应商那里调货。Nginx 的缓存机制就类似于这个超市的仓库储备。

当用户向服务器发送请求时,如果 Nginx 能够直接从缓存中提供所需的数据,而无需将请求传递到后端服务器进行处理,这将大大减少响应时间,提高网站的性能和用户体验。这就像顾客在超市中能够迅速从货架上拿到他们想要的热门商品,无需等待工作人员从仓库深处去寻找。

然而,就像超市的仓库空间有限一样,Nginx 的缓存空间也不是无限的。如果不进行合理的清理和管理,缓存可能会被无用的数据填满,导致真正有用的数据无法被存储,或者影响缓存的查找效率。因此,制定有效的缓存数据清理策略就显得尤为重要。

二、Nginx 缓存数据的类型

在深入探讨 Nginx 的缓存数据清理策略之前,我们先来了解一下 Nginx 缓存的数据类型。

(一)静态文件缓存

这就好比是您书架上那些经久不衰的经典书籍,它们的内容很少变化,比如图片、CSS 文件、JavaScript 文件等。Nginx 可以将这些文件缓存起来,下次有相同的请求时,直接从缓存中返回,无需再次从磁盘读取。

(二)动态内容缓存

类似于每天更新的报纸,虽然内容在不断变化,但某些部分可能在一段时间内具有一定的稳定性,比如经过一段时间才会更新的商品价格、库存信息等。Nginx 可以根据特定的规则对这些动态内容进行缓存,以在一定程度上减少后端服务器的压力。

(三)代理缓存

假设您是一个邮件代收点,您会暂时保存用户的邮件,等待用户来领取。Nginx 作为反向代理时,也会缓存从后端服务器获取的数据,以便在后续相同的请求中快速响应。

三、Nginx 缓存数据清理的触发条件

那么,Nginx 是在什么情况下会决定清理缓存数据呢?这就像是我们定期清理衣柜,可能是因为衣柜满了,也可能是因为某些衣服过时了不再需要。

(一)缓存空间不足

当 Nginx 分配给缓存的存储空间达到上限时,就像衣柜已经塞得满满当当,再也放不下新的衣服了,它需要清理一些旧的数据来为新的数据腾出空间。这种情况下,Nginx 通常会根据某种算法(如 LRU - 最近最少使用)来决定删除哪些缓存数据。

举个例子,假设 Nginx 为缓存分配了 100GB 的空间,而当前已经使用了 95GB。当有新的缓存数据需要存储,但剩余空间不足时,Nginx 会查看所有已缓存的数据,找出那些最近最少被访问的部分并将其删除,以确保能够存储新的数据。

(二)缓存数据过期

每个缓存数据都可以设置一个有效期,就像食品有保质期一样。当缓存数据超过其设定的有效期时,Nginx 会将其视为过期数据并进行清理。

比如说,我们设置了某张图片的缓存有效期为 1 小时。那么 1 小时过后,即使这张图片还在缓存中,Nginx 也会将其删除,以确保用户获取到的是最新的图片。

(三)后端数据更新

如果后端服务器中的数据发生了更新,Nginx 缓存中的数据就可能变得过时。这时,Nginx 需要及时清理相关的缓存数据,以保证用户获取到的是最新、最准确的信息。

打个比方,假如后端服务器中的商品价格发生了变化,而 Nginx 缓存中仍然是旧的价格。为了避免用户看到错误的价格信息,Nginx 会在得知价格更新后,立即清理与该商品价格相关的缓存。

四、Nginx 缓存数据清理策略

了解了触发条件后,接下来让我们详细看看 Nginx 都有哪些具体的缓存数据清理策略。

(一)LRU(Least Recently Used)策略

LRU 策略就像是一个班级里的座位调整。老师总是会把最近表现不好、很少参与课堂的同学调到后排,而把积极活跃、最近表现优秀的同学调到前排。在 Nginx 中,LRU 策略会将最近最少使用的缓存数据删除,以腾出空间给新的或更频繁使用的数据。

例如,Nginx 维护了一个缓存数据的访问链表,最近访问的数据会被移到链表的头部,而长时间未被访问的数据则逐渐向链表的尾部移动。当需要清理缓存时,从尾部开始删除数据。

(二)LFU(Least Frequently Used)策略

LFU 策略则更像是评选班级里的“三好学生”。不是看谁最近表现好,而是看谁在一段时间内整体表现优秀,也就是使用频率最高。Nginx 采用 LFU 策略时,会统计每个缓存数据的被访问频率,删除那些访问频率最低的数据。

假设我们有一组缓存数据,Nginx 会为每个数据记录其被访问的次数。当需要清理缓存时,优先删除访问次数最少的数据。

(三)TTL(Time To Live)策略

TTL 策略就像是给每个缓存数据设置了一个闹钟。当闹钟响起,也就是达到了设定的生存时间,该数据就会被清理。这是一种基于时间的简单而直接的策略。

比如说,我们为某个网页的缓存设置了 TTL 为 30 分钟,那么 30 分钟后,无论这个网页是否被再次访问,Nginx 都会将其从缓存中删除。

(四)随机清理策略

有时候,就像抽奖一样,Nginx 也会采用随机的方式来清理缓存数据。这种策略没有特定的规律,完全是随机选择要删除的数据。

虽然随机清理策略看起来有些“任性”,但在某些情况下,它可以避免某些数据因为特定的模式而一直被保留或删除,从而增加了缓存清理的不确定性和公平性。

五、Nginx 缓存数据清理的配置示例

光说不练假把式,下面让我们通过一些实际的配置示例来看看如何在 Nginx 中实现上述的缓存数据清理策略。

(一)LRU 策略配置

proxy_cache_path  /var/cache/nginx  levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid  200  30m;

server {
    location / {
        proxy_cache my_cache;
        proxy_pass http://backend_server;
    }
}

在上述配置中,max_size 定义了缓存的最大空间,当达到这个限制时,Nginx 会根据 LRU 策略清理缓存。inactive 则指定了如果一个缓存数据在 60 分钟内未被访问,将被视为不活跃并可能被删除。

(二)LFU 策略配置

很遗憾,Nginx 本身并不直接支持 LFU 策略,但我们可以通过一些第三方模块或自己编写脚本来实现类似的功能。

(三)TTL 策略配置

proxy_cache_path  /var/cache/nginx  levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
proxy_cache_key "$scheme$request_method$host$request_uri";

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid  200  30m;  # 设置 200 状态码的响应缓存 30 分钟
        proxy_pass http://backend_server;
    }
}

通过 proxy_cache_valid 指令,我们可以为不同的 HTTP 状态码设置不同的缓存有效期。

(四)随机清理策略配置

Nginx 没有内置的随机清理策略配置选项,但您可以通过一些迂回的方式来实现类似的效果,比如结合脚本定期随机删除一部分缓存数据。

六、实际应用中的优化与注意事项

在实际应用中,选择合适的缓存数据清理策略并非一劳永逸,还需要根据具体的业务需求和场景进行优化和调整。

(一)监控与分析

就像医生需要通过检查来了解病人的病情一样,我们需要对 Nginx 的缓存使用情况进行监控和分析。通过查看缓存的命中率、未命中率、缓存的填充率等指标,我们可以了解缓存的工作效果,并据此调整清理策略和缓存配置。

例如,如果发现缓存的命中率很低,可能意味着缓存的设置不合理,或者清理策略过于激进,删除了太多有用的数据。

(二)考虑业务特点

不同的业务有不同的特点和需求。对于一些对数据实时性要求很高的业务,如金融交易、实时新闻等,可能需要更短的缓存有效期或更频繁的清理;而对于一些相对稳定、变化不频繁的内容,如静态文件、长期不变的产品介绍等,可以设置较长的缓存有效期和较宽松的清理策略。

想象一下,如果是一家股票交易网站,用户肯定希望看到的是实时准确的股价信息,缓存数据的清理就需要非常及时;而对于一个介绍历史文化的网站,文章内容很少变化,缓存可以长时间保留。

(三)结合前端优化

Nginx 的缓存策略还可以与前端的优化技术相结合,如设置合理的 HTTP 缓存头、使用版本号控制静态资源等。这样可以让前端和后端在缓存管理上更加协调一致,提高整体的性能。

比如,前端开发人员可以在静态资源的 URL 中添加版本号,当资源更新时,更改版本号,这样 Nginx 就可以根据版本号来判断是否需要更新缓存。

(四)测试与验证

在对 Nginx 的缓存配置进行更改后,一定要进行充分的测试和验证。这就像在对汽车进行改装后,要进行试驾一样,确保新的配置没有引入新的问题,并且确实提高了网站的性能和用户体验。

可以通过模拟不同的访问场景、压力测试等方式,来检验缓存清理策略的效果和稳定性。

七、总结

Nginx 的缓存数据清理策略就像是一场精心编排的舞蹈,需要在存储空间、数据时效性和用户体验之间找到完美的平衡。通过合理选择清理策略、精细配置参数,并结合实际业务需求进行优化,我们可以让 Nginx 这台强大的服务器发挥出最佳性能,为用户提供更加快速、流畅的网络服务。

就如同一位优秀的管家,精心打理着家中的每一个角落,让一切都井井有条。Nginx 也在默默地为我们的网站服务,通过巧妙处理缓存数据的清理,为用户打开一扇通往快速、高效网络世界的大门。

希望通过本文的介绍,您对 Nginx 的缓存数据清理策略有了更深入的理解和认识,能够在实际应用中运用自如,让您的网站在互联网的海洋中乘风破浪,勇往直前!

line

🎉相关推荐

  • 🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
  • 📘Nginx 技术专栏
  • 🍅CSDN-技术社区

Nginx

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

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

相关文章

PHP简单商城单商户小程序系统源码

🛍️轻松开店,触手可及!「简单商城小程序」让电商梦想照进现实🌟 🎉开店新风尚,「简单商城小程序」引领潮流! 还在为繁琐的电商开店流程烦恼吗?想要快速搭建自己的线上商城&#x…

Linux嵌入式学习——数据结构——线性表的链式结构

线性表的链式存储 解决顺序存储的缺点,插入和删除,动态存储问题。 特点: 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占…

vue3如何实现分面漏斗图

如下图: 这里我选择采用Vue3g2plot进行实现。 参考网址:https://g2plot.antv.antgroup.com/zh/examples/more-plots/funnel/#facet-transpose 核心代码如下: const data [{ stage: 简历筛选, number: 253, company: A公司 },{ stage: 初…

东京裸机云多IP服务器全面分析

东京裸机云多IP服务器是一种提供多IP地址分配和高性能网络服务的云计算解决方案,广泛应用于需要多IP管理和高稳定性的网络应用。下面将从几个方面具体介绍东京裸机云多IP服务器,rak部落为您整理发布东京裸机云多IP服务器的全面分析。 在数字化时代&#…

Docker 部署常用中间件(redis,rabbitMQ,mysql8,es,kibana,nginx等)亲测成功~~~

Docker 部署常用中间件 在日常开发中必要的环境,大多数都是单点后续持续更新集群模式~~~ docker 安装reids docker pull redis:7.2.5 编辑redis.conf # 绑定地址,默认只允许本机访问 # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 bind 0.0…

学员心得 | 做好这几点,轻松通关云计算HCIE3.0!

烈日当空,骄阳似火,在这炎炎夏日迎来了自己今年一份满意的答卷--华为HCIE云计算“通过”的e妹儿(嘿嘿!证书也快了)。此时此刻,想把自己“辛勤劳作”备考IE的一些经历和建议留给后来的同路人。 “世界上最可…

MySQL练手 --- 619. 只出现一次的最大数字

题目链接:619. 只出现一次的最大数字 思路 这是一个简单题,只出现一次的最大数字,顾名思义,分两个阶段,第一个阶段筛选出只出现一次的数字,第二阶段在生成的新表中筛选出最大值即可。 解题过程 生成一张…

iOS object-C 解答算法:找到所有数组中消失的数字(leetCode-448)

找到所有数组中消失的数字(leetCode-448) 题目如下图:(也可以到leetCode上看完整题目,题号448) 光看题看可能有点难以理解,我们结合示例1来理解一下这道题. 有8个整数的数组 nums [4,3,2,7,8,2,3,1], 求在闭区间[1,8]范围内(即1,2,3,4,5,6,7,8)的数字,哪几个没有出现在数组 …

华为OD机试 - 二叉树计算(Java JS Python C C++)

题目描述 给出一个二叉树如下图所示: 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。 输入描述 2行整数,第1行表示二叉…

MySQL数据库-备份恢复

一、MySQL日志管理 1.为什么需要日志 用于排错用来做数据分析了解程序的运行情况,了解MySQL的性能 2.日志作用 在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,就必须保证数据的安全性和完整性&#…

Spring AI (五) Message 消息

5.Message 消息 在Spring AI提供的接口中,每条信息的角色总共分为三类: SystemMessage:系统限制信息,这种信息在对话中的权重很大,AI会优先依据SystemMessage里的内容进行回复; UserMessage:用…

c++笔记4

目录 深度优先搜索DFS DFS的复杂度 DFS与递归 递归与暴力枚举 递归树 DFS与栈 DFS的搜索剪枝 搜索剪枝与优化 可行性剪枝 最优化剪枝 减少等效的分支 优化搜索顺序 搜索的记忆化 搜索的复杂度 大多时候,搜索的复杂度都是指数级的。各种剪枝方案&#…

RK3568笔记四十三:MPU6050驱动开发(硬件I2C_3)

若该文为原创文章,转载请注明原文出处。 正点原子提供的I2C有测试ap3216c,SH3001等传感器,根据手册操作可以实现效果。 这里记录使用I2C3驱动MPU6050. 记录原因是前面有模拟I2C,但硬件如何使用,有点不是很清楚&#…

[C++] string管理:深浅拷贝写时拷贝

文章目录 拷贝问题的引入问题代码string类的构造函数String 类的析构函数测试入口函数(问题)详细分析 浅拷贝深拷贝传统版与现代版的String类传统String类现代版String类 写时拷贝先构造的对象后析构的影响写时拷贝举例及测试样例代码举例测试用例 拷贝问…

BGP之选路MED

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时,BGP协议会对这些BGP路由的属性进行比较,以确定去往该目标网络的最优BGP路由。BGP路由属性的比较顺序为Preferred Value属性、Local Preference属性、路由生成方式、AS_Path属性、Origin属…

react中路由跳转以及路由传参

一、路由跳转 1.安装插件 npm install react-router-dom 2.路由配置 路由配置:react中简单的配置路由-CSDN博客 3.实现代码 // src/page/index/index.js// 引入 import { Link, useNavigate } from "react-router-dom";function IndexPage() {const …

大数据之Oracle同步Doris数据不一致问题

数据同步架构如下: 出现的问题: doris中的数据条数 源库中的数据条数 总数完全不一致。 出现问题的原因: 在Dinky中建立表结构时,缺少对主键属性的限制 primary key(ID) not enforced 加上如上语句,数据条数解决一致 …

WPF+Mvvm项目入门完整教程-仓储管理系统(二)

目录 一、搭建一个主界面框架二、实现步骤1.主界面区域划分2.主界面区域实现 一、搭建一个主界面框架 主要实现主界面的框架样式和基础功能。这里特别说明一下,由于MvvmLight 已经过时不在维护,本项目决定将MvvmLight框架变更为 CommunityToolkit.Mvvm …

标题:探索pdf2image:将PDF文档转化为图像的Python魔法

标题:探索pdf2image:将PDF文档转化为图 像的Python魔法 背景 在数字时代,我们经常需要处理各种格式的文档,尤其是PDF文件。PDF以其跨平台的可读性和稳定性而广受欢迎。然而,有时我们需要将PDF文件转换成图像格式&am…

Golang | Leetcode Golang题解之第282题给表达式添加运算符

题目: 题解: func addOperators(num string, target int) (ans []string) {n : len(num)var backtrack func(expr []byte, i, res, mul int)backtrack func(expr []byte, i, res, mul int) {if i n {if res target {ans append(ans, string(expr))}…