Caching 是否与etags和多服务器设置保持一致?

Caching 是否与etags和多服务器设置保持一致?,caching,distributed-caching,distributed-system,Caching,Distributed Caching,Distributed System,我试图了解在RESTAPI层允许查询和更新客户注册数据库的情况下,哪种缓存策略是最好的。我们目前有3个前端服务器,都与一个中央数据库服务器进行通信 想法是将etag返回给调用客户机,etag与客户记录版本id(在帐户发生任何更改时更新的哈希值)匹配,并且仅当接收到的etag与数据库中存储的版本id匹配时才接受更新调用 假设客户机对负载平衡器路由到服务器1的客户记录执行GET。服务器1没有缓存客户记录,因此将查询数据库,在本地缓存记录,并将记录作为包括etag头的调用响应返回 如果第二个客户端到达

我试图了解在RESTAPI层允许查询和更新客户注册数据库的情况下,哪种缓存策略是最好的。我们目前有3个前端服务器,都与一个中央数据库服务器进行通信

想法是将etag返回给调用客户机,etag与客户记录版本id(在帐户发生任何更改时更新的哈希值)匹配,并且仅当接收到的etag与数据库中存储的版本id匹配时才接受更新调用

假设客户机对负载平衡器路由到服务器1的客户记录执行GET。服务器1没有缓存客户记录,因此将查询数据库,在本地缓存记录,并将记录作为包括etag头的调用响应返回

如果第二个客户端到达并对路由到服务器2的同一客户记录执行相同的GET,服务器2还将本地缓存条目并返回相同的etag头

让我们假设现在第一个客户端已经通过服务器1对同一记录执行了更新调用。服务器1缓存使用最新的记录详细信息进行更新,第一个客户端返回一个新的etag

在此之后,第二个客户端执行条件get调用,提供与接收到的etag设置的“If None Match”头。请求将再次命中服务器2。我的假设是,服务器2仍将缓存旧etag,并将向客户端返回304 Not Modified响应。这是正确的假设吗

在这种情况下,客户机很容易得到过时的数据,并会影响在客户机端看到和使用的数据的总体一致性

需要什么来解决这个问题并确保在任何时候都不会将过时的客户记录数据返回给客户

非常感谢

缓存失效是一个需要解决的问题。至少有三种方法可以解决这个问题。它们因复杂性和过期记录被视为有效的时间长短而异

  • 最简单的答案是,所有前端服务器必须在返回“304 Not Modified”之前调用数据库来验证etag。如果有很多更新或者从数据库下载记录的成本很高,这可能是最好的

  • 如果有时可以发回一个旧值,那么可以设置缓存项的过期时间

  • 另一个选项是,当1个前端服务器看到更新时,它需要通知其他前端服务器使该缓存项过期(可能通过调用webservice?)。这允许较长的缓存持续时间,但如果有大量更新,则可能会过于频繁

  • 缓存失效是一个需要解决的问题。至少有三种方法可以解决这个问题。它们因复杂性和过期记录被视为有效的时间长短而异

  • 最简单的答案是,所有前端服务器必须在返回“304 Not Modified”之前调用数据库来验证etag。如果有很多更新或者从数据库下载记录的成本很高,这可能是最好的

  • 如果有时可以发回一个旧值,那么可以设置缓存项的过期时间

  • 另一个选项是,当1个前端服务器看到更新时,它需要通知其他前端服务器使该缓存项过期(可能通过调用webservice?)。这允许较长的缓存持续时间,但如果有大量更新,则可能会过于频繁


  • +@David列表的另一个解决方案:

  • 使用集中式缓存。它应该能解决你的问题。 尽管它不如本地缓存有效,但在大多数情况下仍比查询数据库快
  • 可能的集群缓存实现有:couchbaseredis cluster
    最流行的非集群实现是memcachedmemcached

    +还有一个@David列表解决方案:

  • 使用集中式缓存。它应该能解决你的问题。 尽管它不如本地缓存有效,但在大多数情况下仍比查询数据库快
  • 可能的集群缓存实现有:couchbaseredis cluster。 最流行的非集群实现是memcached

    ,正如Google发布的文章中所述,您可以使用分层缓存来解决特定情况下的缓存失效问题,特别是对于静态资产

    根据资产的指纹(附加)命名资产并使顶层不可缓存是本文的基本思想。

    正如Google发表的文章所述,您可以使用分层缓存来解决特定情况下的缓存失效问题,特别是静态资产


    根据资产的指纹命名资产(附加)并使顶层不可缓存是本文的基本思想。

    您可以对我的答案发表评论。:)你可以评论我的回答。:)