有时间限制的缓存


1.题目描述

编写一个类,它允许获取和设置键-值对,并且每个键都有一个 过期时间 。

该类有三个公共方法:

set(key, value, duration) :接收参数为整型键 key 、整型值 value 和以毫秒为单位的持续时间 duration 。一旦 duration 到期后,这个键就无法访问。如果相同的未过期键已经存在,该方法将返回 true ,否则返回 false 。如果该键已经存在,则它的值和持续时间都应该被覆盖。

get(key) :如果存在一个未过期的键,它应该返回这个键相关的值。否则返回 -1 。

count() :返回未过期键的总数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
var TimeLimitedCache = function () {
// 保存键值对
this.map = new Map();
// 保存过期时间到需要清理键值对的 setTimeout 返回的 ID 值
this.timeIds = {};
};

/**
* @param {number} key
* @param {number} value
* @param {number} time until expiration in ms
* @return {boolean} if un-expired key already existed
*/
TimeLimitedCache.prototype.set = function (key, value, duration) {
const res = this.map.has(key);
this.map.set(key, value);
// 如果该键已经存在,则它的值和持续时间都应该被覆盖
// 传入一个错误的 ID 给 clearTimeout()不会有任何影响;也不会抛出异常
clearTimeout(this.timeIds[key]);
this.timeIds[key] = setTimeout(() => {
// 一旦 duration 到期后,这个键就无法访问
this.map.delete(key);
}, duration);
// 如果相同的未过期键已经存在,该方法将返回 true ,否则返回 false
return res;
};

/**
* @param {number} key
* @return {number} value associated with key
*/
TimeLimitedCache.prototype.get = function (key) {
// 空值合并运算符(??)是一个逻辑运算符,
// 当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数
return this.map.get(key) ?? -1;
};

/**
* @return {number} count of non-expired keys
*/
TimeLimitedCache.prototype.count = function () {
return this.map.size;