【问题标题】:How to implement properly expire feature for collection in Node.js?如何在 Node.js 中正确实现集合的过期功能?
【发布时间】:2020-09-03 10:00:44
【问题描述】:

我想实现一个元素可以过期和被删除的集合。因为我对 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 吗?有没有其他的实现方式?

【问题讨论】:

  • 使用setTimeout(),而不是setInterval() 作为一次性计时器。

标签: javascript node.js collections


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2020-06-27
    • 2016-06-24
    • 2022-09-22
    • 2021-03-26
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多