节点js中的LRU缓存

时间:2017-07-25 09:10:15

标签: node.js caching lru

我需要为我的项目实施缓存(对于我的组织),我们计划内存LRU缓存,我有一些软件包,但我不确定许可条款,我发现最好的是这个

https://www.npmjs.com/package/lru-cache

但是当我将缓存声明为

时,我遇到了一些问题
   var LRU = require("lru-cache")
  , options = { max: 2
              , length: function (n, key) { return n * 2 + key.length }
              , dispose: function (key, n) { n.close() }
              , maxAge: 1000 * 60 * 60 }
  , cache = LRU(options)
  console.log(cache.length)
  cache.set(1,1)
  cache.set(2,2)
  cache.set(3,3)
  console.log(cache.length)
  console.log(cache.get(1))
  console.log(cache.get(2))
  console.log(cache.get(3))
  console.log(cache)

上面代码的输出是

0
NaN
1
2
3
LRUCache {}

它没有设置最大值,它似乎是无限的 即使长度为2,也不会删除LRU元素并在缓存中添加所有三个元素

是否还有其他软件包?我也在考虑实现自己的缓存机制,节点js的最佳实践是什么。

1 个答案:

答案 0 :(得分:2)

让我们修改一下你的代码,这样我就可以更好地解释错误了。

   var LRU = require("lru-cache")
  , options = { max: 2
              , length: function (n, key) { return n * 2 + key.length }
              , dispose: function (key, n) { n.close() }
              , maxAge: 1000 * 60 * 60 }
  , cache = LRU(options)
  console.log(cache.length)
  cache.set(1,10) // differentiate the key and the value
  cache.set(2,20)
  cache.set(3,30)
  console.log(cache.length)
  console.log(cache.get(1))
  console.log(cache.get(2))
  console.log(cache.get(3))
  console.log(cache)

每次在缓存中设置值时都会调用length函数。当您调用cache.set(1,10)时,您之前定义的函数长度具有以下参数:n(数字10)和密钥(数字1)。

因此,您在此处看到key.length未定义,因为数字没有长度属性,而undefined的总和将为NaN。在文档中,作者使用属性长度,因为通常缓存键是一个字符串。你当然可以使用一个数字作为键,但这就是打破这个。

解决此问题后,您必须注意功能配置。我引述作者:

  

dispose:从缓存中删除项目时调用的函数。   如果要关闭文件描述符或执行其他操作,这可能很方便   当项目不再可访问时清理任务。

在这个简单的例子中,我认为你不需要它,所以你可以删除它。