首页 > 解决方案 > 如何在 Node.js 中正确实现集合的过期功能?

问题描述

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

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多次调用?有没有其他方法来实现它?

标签: javascriptnode.jscollections

解决方案


你的方法基本上是合理的。但是,您对 Intervals 的使用存在问题。

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

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

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

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


推荐阅读