我正在实现运行匹配算法的node.js服务器。由于我希望尽快让服务器响应,我希望能够从缓存中检索数据,而不是每次都查询数据库。例如,我需要保留10000-50000个用户的信息。我担心这会占用大量内存。有没有办法将这么多数据存储在缓存中而没有RAM耗尽的风险?
答案 0 :(得分:4)
现在,基于我从你的问题中读到的内容,如果#2,那么你的目标似乎就是这样。如果是这样,那么你没有选择,只能确定你想要在内存中保留多少数据的大小。然后应该使用该大小来获得足够的RAM来保存结果,而不是回到数据库。
像ehCache这样的缓存框架还提供了从磁盘交换数据的选项。从ehCache(http://www.ehcache.org/documentation/user-guide/storage-options#memory-use-spooling-and-expiry-strategy)查看此链接;这应该可以帮助您设计缓存应该如何设置,也就是驱逐策略以保持大小可控,以及何时(以及如何)准备将数据假脱机到底层磁盘存储。假脱机到磁盘意味着你需要有硬盘。但是,如果DB比底层缓存存储更快,你需要一些基准测试。
你可以选择像ehCachs,JCS这样的JVM缓存,甚至可以选择更复杂的框架,比如memcache,redis,它可以为你完成所有这些OOTB。
欢呼声 卡皮尔
答案 1 :(得分:3)
你可以使用memcached或redis,他们自己关心内存并且缺乏删除过时的数据
答案 2 :(得分:1)
node-memchache比redis更快,更容易实现。你可以看到 https://github.com/ptarjan/node-cache
答案 3 :(得分:1)
使用mcache,可以很容易地从Node.js中的数据库查询缓存数据。
以下是从MySQL缓存查询的示例:
const Mcache = require('mcache');
const garbageCollectionInSeconds = 10;
const timeToLiveInSeconds = 60;
// This function will be called to update the cache
const update = function (id, callback) {
mysql.query('SELECT ... WHERE id=?', id, callback);
};
const cache = new Mcache(timeToLiveInSeconds, garbageCollectionInSeconds, update);
const id = 'some-entity-id';
cache.get(id, function (error, data) {
if (error) {
console.error(error.message);
} else {
console.log(`Result: ${data}`);
}
});