gpt4 book ai didi

database - 处理内存缓存中的陈旧数据

转载 作者:太空狗 更新时间:2023-10-30 01:49:23 25 4
gpt4 key购买 nike

假设在数据库前使用内存缓存(如redis/memcache)的策略是:

  1. 读取:客户端会首先尝试从缓存中读取。在缓存未命中时,从数据库中读取数据并将数据放入缓存中。

  2. 写作:先更新数据库,再删除缓存项。

假设以下顺序发生:

  1. 客户端 A 从缓存中读取并未命中。
  2. 客户端A从数据库中读取。
  3. 客户端 B 更新数据库中的相同条目。
  4. 客户端 B 删除(不存在的)缓存条目。
  5. 客户端 A 将(陈旧的)条目放入缓存中。
  6. 然后客户端 C 将读取缓存中的陈旧数据。

是否有避免这种情况的策略?我知道我们可以为每个缓存条目设置一个过期时间,但仍然有可能读取过时的数据,这在某些情况下可能是不可取的。

最佳答案

您可以对缓存数据进行版本控制并保持每个版本不可变。每次数据库中的数据发生变化时,都会增加一个整数版本列。缓存键必须包含版本号。然后客户端可以首先查看数据库以查找当前版本号,然后与缓存对话。

保持缓存一致非常困难,因为它们以非事务方式运行。没有通用的方法可以防止您正在谈论的那种问题。理想情况下,您希望以原子方式使写入在数据库和缓存中可见,但这只有在特殊情况下才有可能。就像我提出的方案一样。

关于database - 处理内存缓存中的陈旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23933158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com