javascript - 如何在 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
多次调用?有没有其他方法来实现它?
解决方案
你的方法基本上是合理的。但是,您对 Intervals 的使用存在问题。
看起来您为集合中的每个项目设置了一个单独的间隔,其目的是在其生存时间到期时将其删除。但是间隔会重复,直到您取消它们。您可能应该在这里使用超时。如果某个项目以某种方式从您的收藏中删除,请务必取消其超时。
处理此类事情的更有效方法:
- 不要对集合中的每个对象使用单独的超时。
- 让您的 get() 方法检查您的项目是否已过期,如果是则返回 null。
- 为每个集合设置一个间隔以每隔一段时间(几秒钟或几分钟)运行一次,并删除所有过期的项目。
为此,我使用了一个名为 node-cache 的模块。https://www.npmjs.com/package/node-cache 它对我来说完美运行了几个月的正常运行时间和计数。
推荐阅读
- java - 用 super(objects) 替换子类构造函数有什么问题?
- python - Pyspark 从 kafkaDirectStream 到 Postgresql
- google-apps-script - 有没有办法在 Google 帐户级别创建 Google Apps 触发器,而不是特定于一个表单?
- html - 为什么在尝试创建带有品牌徽标的导航栏时,品牌徽标会将其余部分向下推?
- html - :hover 在段落内的悬停链接上不起作用
- java - 将变量从 JFrame 传递到 JPanel?
- sapui5 - 在 Datepicker (SAP UI5) 上设置默认日期
- java - 未找到由接口定义的代理类
- c# - C#字典添加值数组
- javascript - 使用正则表达式和测试的字符串比较