繁体   English   中英

如何正确实现 Node.js 中集合的过期功能?

[英]How to implement properly expire feature for collection in Node.js?

我想实现一个元素可以过期并被删除的集合。 因为我对 Javascript 没有什么经验,所以找不到最好的方法。 在另一种语言中,我会使用一个线程来迭代清理过期元素的集合。 但是在 Javascript 中,这是不可能的,除了使用setInterval function 之外,我想不出解决方案。因此每次插入一个元素时,都会注册一个回调 function,以便稍后清理该元素。

class Collection {
    constructor() {
        this.items = new Map()
    }

    put(key, value, expireIn) {
        this.items.set(key, value)
        setInterval(() => {
            this.items.delete(key)
        }, expireIn)
    }

    get(key) {
        return this.items.get(key)
    }
}

你认为这种方法会有一些限制吗? 例如,多次调用setInterval是否可以? 还有其他方法可以实现吗?

您的方法从根本上来说是合理的。 但是,您对 Intervals 的使用存在问题。

看起来您为集合中的每个项目设置了一个单独的间隔,其目的是在其生存时间到期时将其删除。 但是间隔会重复,直到您取消它们。 您可能应该在这里使用超时。 如果某个项目以某种方式从您的收藏中删除,请务必取消其超时。

处理此类事情的更有效方法:

  • 不要对集合中的每个 object 使用单独的超时。
  • 让您的 get() 方法检查您的商品是否已过期,如果是,则返回 null。
  • 为每个集合设置一个间隔,每隔一段时间(几秒或几分钟)运行一次,并删除所有过期的项目。

为此,我使用了一个名为 node-cache 的模块。 https://www.npmjs.com/package/node-cache在几个月的正常运行时间和计数中,它对我来说完美无瑕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM