我需要为我的项目实施缓存(对于我的组织),我们计划内存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的最佳实践是什么。
答案 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:从缓存中删除项目时调用的函数。 如果要关闭文件描述符或执行其他操作,这可能很方便 当项目不再可访问时清理任务。
在这个简单的例子中,我认为你不需要它,所以你可以删除它。