gpt4 book ai didi

node.js - Redis 缓存 - 如何避免竞争条件?

转载 作者:IT王子 更新时间:2023-10-29 06:00:51 25 4
gpt4 key购买 nike

我想使用 Redis 缓存数据库查询。目前,单个 API 端点中的伪代码如下所示:

GET /data
  1. 检查对象是否在 REDIS 缓存中(通过 cacheKey)
  2. 如果在缓存中就返回给客户端
  3. 如果不在缓存中,则从数据库中获取数据
  4. 将数据写入REDIS缓存(在cacheKey)
  5. 返回数据给客户端

我正在缓存不经常更改的对象,因此我将过期时间设置为例如 24 小时。问题是当我想更新这样的对象时。伪代码如下所示:

PUT /data
  1. 更新数据库中的数据
  2. 将数据写入缓存(或者只是将缓存设置为空/删除表单缓存)

问题是,在新数据写入缓存(或缓存已删除)后,GET/data 仍然可以用旧数据覆盖缓存中的新数据。当点 4 形式 GET/data 刚好在 PUT/data 点 2 之后执行时,会发生这种情况。

是否有任何机制可以防止缓存中的旧数据覆盖新数据?

最佳答案

如果 PUT 在将新数据放入数据库的同时将新数据放入缓存(直写缓存),您可以使用 SET/HSET 当从你的 PUT 写入缓存时, SETNX/HSETNX 当写入缓存时来自你的 GET。由于 GET 仅在 key 不存在时才写入缓存,因此通常 SETNX 会成功。但是,如果其他人(可能是 PUT)在此期间出现并设置了 key ,则 SETNX 将失败,因为 key 已经存在,您将得到结果你想要的。

PUT 只是删除缓存中的数据以供下一个 GET 重新填充的情况下,我认为您无法提供比您更好的保证已经有。从数据库中检索数据后,数据将存在一个过期时间,严格来说这并不是错误,只是比您希望的更糟。

关于node.js - Redis 缓存 - 如何避免竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25226246/

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