【问题标题】:How to correctly invalidate Redis Cache to maintain consistency如何正确使Redis Cache失效以保持一致性
【发布时间】:2022-11-23 10:43:21
【问题描述】:

我专注于缓存失效。因此,当客户端更新主要数据时,我计划驱逐缓存中的密钥,以便下次某个客户端读取数据时,他们需要将数据写回缓存。这种方法看起来很简单,但我预想可能会出现不一致的情况。

  1. 客户端 A 检查并没有看到任何缓存数据。
  2. 客户端A查询原始数据,得到版本A。
  3. 客户端 B 将主要数据更新为版本 B。
  4. 客户端 B 暴力破解缓存中的数据。
  5. 客户端 A 更新缓存到版本 A。

    所以现在缓存包含不正确的版本 A。那么如何解决呢?

【问题讨论】:

    标签: caching redis


    【解决方案1】:

    首先,既然用的是缓存,就得忍受不一致。在您的情况下,通常这不是问题,因为 1) 它不会一直发生,2) 当您在步骤 5 中设置的数据过期时,客户端可以获得最新数据。

    但是,您可以尝试以下(更复杂的)策略:

    1. 客户端 B 暴力破解缓存中的数据。

    不是删除数据,而是使用新版本号将数据设置为过时。版本号应该是单调递增的。

    1. 客户端 A 更新缓存到版本 A。

    在更新Redis 数据之前,先检查Redis 数据和待更新数据的版本号。当且仅当 A 具有更新/更大的版本号时才进行更新。

    笔记:

    1. 这不是一个完美的解决方案。第 4 步可能会增加内存使用量,您应该设置较小的 TTL。
    2. 第5步应该使用Lua脚本来保证原子性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-20
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多