nginx 动态缓存,如何让 nginx 服务器知道后端数据是否发生更新?

2021-01-06 22:43:22 +08:00
 black11black
如题,百度搜索了一些 nginx 缓存相关的知识,其中缓存动态页面的部分没太看明白,写的比较清楚的也不多,来 v2 问一下老哥。

目前需求是,有一接口执行某科学运算操作,需要后端调用数据库进行一个大的连表,调用时间大概在一分钟左右,这里为了简化,代表这个接口是不断变化的,假设该接口地址为 127.0.0.1/api,返回请求时候的 utc 时间。

百度上对于 nginx 静态缓存说的挺明白的,客户浏览器请求资源时候还是会向服务器确认,如果文件修改时间无变化,则不传输新文件。

但动态的部分看了一些文章写的都不是很清楚,nginx 似乎是有缓存动态页面的能力的,但是我没看懂 nginx 如何向后端服务器确认是否需要更新页面。

比如一用户在 2021 年 1 月 1 日上午 9 点访问 127.0.0.1/api,得到结果 2021-1-1 09:00,而后在十分钟后再次访问。此时正确返回结果应为 2021-1-1 09:10,但是如果后端觉得这个结果不刷新也行,如何告知 nginx 不需要发起新的计算请求呢?

=

还有一个疑问是,缓存与 worker 的管理策略是什么,如果假设 10 个 worker 各自管理自己的缓存内容,岂不是效率很低么
1312 次点击
所在节点    问与答
7 条回复
westoy
2021-01-06 23:00:56 +08:00
缓存动态页也是静态缓存, 就是 CDN 的基本功能之一, 一般服务端程序自己控制颗粒的才叫动态缓存

nginx 页面缓存一个是时间控制, 一个是自己对页面发 PURGE 请求强制缓存失效

我印象里 nginx 是 master 创建 shm, 然后 worker 共享操作的
black11black
2021-01-07 07:49:07 +08:00
@westoy 接触动态缓存概念很少,不是很理解。“自己对页面发 PURGE 请求强制缓存失效”,这个自己指的是客户端发出强制请求还是服务后端发出强制请求
cominghome
2021-01-07 07:54:17 +08:00
没仔细研究过 nginx,但是动态缓存一般不考虑那么多,设置一个合理的过期时间就可以了
lvzhiqiang
2021-01-07 08:10:29 +08:00
nginx 一般做静态缓存,动态缓存用的不多,你可以根据自己的业务逻辑写 nginx 嵌入式脚本定时刷新后端接口拿最新数据缓存起来。 缓存是多个 woker 之间共享,因为不能保证 woker 处理一直是同一个真实客户端。
black11black
2021-01-07 09:07:13 +08:00
@lvzhiqiang 没用过 nginx 嵌入式脚本,嵌入式脚本实现的目的是 nginx 主动定期向后端请求刷新资源吗?主要是需求上,这个科学计算任务最好是有缓存,否则太慢了。而缓存如果后端通过 nosql 实现的话挺麻烦的,想看看 nginx 有没有成熟方案,不过目前看来似乎是没有,似乎还是用 redis 之类的缓存一下更好。
watzds
2021-01-07 09:21:29 +08:00
Nginx Microcaching 嘛
lvzhiqiang
2021-01-07 09:52:32 +08:00
@black11black 是的,定期执行刷新,把数据加载到本地或者 redis 缓存里面,用户通过接口访问的时候,直接从缓存取数据,不会透传到后端服务。nginx 本身是没有这样的模块。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/742352

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX