【问题标题】:Does node-cache uses locks节点缓存是否使用锁
【发布时间】:2020-11-18 19:12:26
【问题描述】:

我试图了解node-cache 包是否对缓存对象使用了锁并且找不到任何东西。

我试图查看源代码,但它看起来不像,但 this answer 建议与引用相反:

所以内存锁有 Redis 和节点缓存。

此缓存用于 CRUD 服务器,我想确保 GET/UPDATE 请求不会对数据造成竞争条件。

【问题讨论】:

  • 你自己去看the source code了吗?
  • 正如我所说,我看了,确实不像,但我想知道是否可能由于其他人的评论而遗漏了什么,还有一些小测试我这样做确实让它看起来像是被锁定了
  • 我没有看到任何锁定代码的证据。如果对不在缓存中的相同键的两个请求一个接一个地发出,那么它将启动两个单独的fetch() 操作,并且最后返回的请求将保留在缓存中。通常可能不是问题,但改进的实现可以只对同一个键发出一个请求,而第二个请求只是等待第一个请求提供值。
  • 由于缓存本身都是在内存中的,所有对缓存的访问都是同步的,因此受 Javascript 的单线程特性的约束。因此,并发问题可能会影响缓存代码本身的唯一地方是它们启动异步fetch() 操作时。当然,在如何使用访问数据的代码时,会出现竞争条件,就像使用数据库接口一样,因此调用代码必须对竞争性的事情很聪明。

标签: node.js caching locking


【解决方案1】:

我没有看到任何锁定 the code 的证据。

如果对不在缓存中的相同键的两个请求一个接一个地发出,那么它将启动两个单独的fetch() 操作,并且最后返回的请求将保留在缓存中。这通常可能不是问题,但改进的实现可以只对同一个键发出一个请求,而第二个请求只是等待第一个请求提供已经在运行中的值。

由于缓存本身都在内存中,因此对缓存的所有访问都是同步的,因此受 Javascript 的单线程特性的约束。因此,并发问题可能影响缓存代码本身的唯一地方是它们启动异步fetch() 操作时。

当然,在如何使用访问数据的代码时,会出现竞争条件,就像使用数据库接口一样,因此调用代码必须聪明地了解它如何使用接口以避免产生竞争条件,因为它如何调用事物。

【讨论】:

  • @shlomita - 这回答了你的问题吗?如果是这样,您可以通过单击答案左侧的复选标记向社区表明这一点,这也将为您在此处获得一些声誉积分,以遵循正确的程序。
【解决方案2】:

很遗憾没有,你可以写个单元测试来确认一下。

我已经编写了一个库来解决这个问题,还添加了通读方法来简化代码的使用: https://github.com/KhanhPham2411/node-cache-async-lock

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2017-01-04
    • 1970-01-01
    • 2014-05-26
    • 2018-06-11
    相关资源
    最近更新 更多