V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
black11black
V2EX  ›  问与答

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

  •  
  •   black11black · 2021-01-06 22:43:22 +08:00 via Android · 1283 次点击
    这是一个创建于 1218 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,百度搜索了一些 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 各自管理自己的缓存内容,岂不是效率很低么
    7 条回复    2021-01-07 09:52:32 +08:00
    westoy
        1
    westoy  
       2021-01-06 23:00:56 +08:00
    缓存动态页也是静态缓存, 就是 CDN 的基本功能之一, 一般服务端程序自己控制颗粒的才叫动态缓存

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

    我印象里 nginx 是 master 创建 shm, 然后 worker 共享操作的
    black11black
        2
    black11black  
    OP
       2021-01-07 07:49:07 +08:00
    @westoy 接触动态缓存概念很少,不是很理解。“自己对页面发 PURGE 请求强制缓存失效”,这个自己指的是客户端发出强制请求还是服务后端发出强制请求
    cominghome
        3
    cominghome  
       2021-01-07 07:54:17 +08:00
    没仔细研究过 nginx,但是动态缓存一般不考虑那么多,设置一个合理的过期时间就可以了
    lvzhiqiang
        4
    lvzhiqiang  
       2021-01-07 08:10:29 +08:00
    nginx 一般做静态缓存,动态缓存用的不多,你可以根据自己的业务逻辑写 nginx 嵌入式脚本定时刷新后端接口拿最新数据缓存起来。 缓存是多个 woker 之间共享,因为不能保证 woker 处理一直是同一个真实客户端。
    black11black
        5
    black11black  
    OP
       2021-01-07 09:07:13 +08:00
    @lvzhiqiang 没用过 nginx 嵌入式脚本,嵌入式脚本实现的目的是 nginx 主动定期向后端请求刷新资源吗?主要是需求上,这个科学计算任务最好是有缓存,否则太慢了。而缓存如果后端通过 nosql 实现的话挺麻烦的,想看看 nginx 有没有成熟方案,不过目前看来似乎是没有,似乎还是用 redis 之类的缓存一下更好。
    watzds
        6
    watzds  
       2021-01-07 09:21:29 +08:00 via Android
    Nginx Microcaching 嘛
    lvzhiqiang
        7
    lvzhiqiang  
       2021-01-07 09:52:32 +08:00
    @black11black 是的,定期执行刷新,把数据加载到本地或者 redis 缓存里面,用户通过接口访问的时候,直接从缓存取数据,不会透传到后端服务。nginx 本身是没有这样的模块。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3917 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:28 · PVG 18:28 · LAX 03:28 · JFK 06:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.