缓存具有特定行为的 api 的解决方案

Solution for caching an api with specific behaviour

我正在开发一个服务于游戏的休息api。服务器上每三分钟运行一次作业,更新该游戏的重要信息。所以在这个作业运行后,我需要使缓存无效并使用最近的信息创建一个新缓存。

好的,我在我的应用程序上实现了MemCached,但是一位高级开发人员说拥有其他缓存非常重要。他建议我使用 Varnish,但我真的不知道它是否符合我的逻辑。

您对我如何实现这一点有什么建议吗?

您可以使用 Mcrouter 一个 memcached 协议路由器来基本上复制您的 Memcache。 此配置可以处理您的请求:

{
"pools": {
    "A": {
        "servers": [
            // First Memcache address:
            "memcache_1_ip:11211",
            // Second Memcache address:
            "memcache_2_ip:11211"
        ]
    }
},
"route": {
    "type": "OperationSelectorRoute",
    "operation_policies": {
        "add": "AllSyncRoute|Pool|A",
        "delete": "AllSyncRoute|Pool|A",
        "get": "LatestRoute|Pool|A",
        "set": "AllSyncRoute|Pool|A"
    }
}

清漆在您的情况下可以正常工作。当然,Memcached 用于缓存瞬态数据,而 Varnish 是一个完整的页面缓存,因此它非常适合减少后端应用程序的负载(无论它支持哪种语言,PHP 或任何语言)。

您无需对您的应用程序进行任何更改即可使用 Varnish 正确缓存内容(但是您也可以走这条路,并调整您的应用程序以发送正确的缓存 headers)。只需使用有关缓存策略的说明开发 VCL(Varnish 配置语言)文件。

不要对在线找到的 VCL 文件使用完整的复制粘贴。尽可能添加最小的代码片段,了解事情是如何工作的,Varnish 不会让你失望。重要的是:

  • 确保您的缓存因 API 令牌而异(如果您用于 API 身份验证)。您将在 vcl_hash 过程中实现它。

  • 在您的作业中集成缓存清除以更新信息:可以使用 PURGE HTTP 请求清除 Varnish 缓存(同样,您需要开发必要的 VCL 代码来更新信息)它,在 vcl_recv 过程中)。