最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScrip實(shí)現(xiàn)一個(gè)有時(shí)間限制的緩存類的方式

 更新時(shí)間:2024年01月15日 08:24:07   作者:JYeontu  
本文將探索 JavaScript 中一種基于自動(dòng)過(guò)期機(jī)制的時(shí)間限制緩存實(shí)現(xiàn)方式,提高數(shù)據(jù)緩存策略的靈活性和效率,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

題目描述

編寫(xiě)一個(gè)類,它允許獲取和設(shè)置鍵-值對(duì),并且每個(gè)鍵都有一個(gè) 過(guò)期時(shí)間 。

該類有三個(gè)公共方法:

set(key, value, duration) :接收參數(shù)為整型鍵 key 、整型值 value 和以毫秒為單位的持續(xù)時(shí)間 duration 。一旦 duration 到期后,這個(gè)鍵就無(wú)法訪問(wèn)。如果相同的未過(guò)期鍵已經(jīng)存在,該方法將返回 true ,否則返回 false 。如果該鍵已經(jīng)存在,則它的值和持續(xù)時(shí)間都應(yīng)該被覆蓋。

get(key) :如果存在一個(gè)未過(guò)期的鍵,它應(yīng)該返回這個(gè)鍵相關(guān)的值。否則返回 -1 。

count() :返回未過(guò)期鍵的總數(shù)。

示例 1:

輸入: 
actions = ["TimeLimitedCache", "set", "get", "count", "get"]
values = [[], [1, 42, 100], [1], [], [1]]
timeDeays = [0, 0, 50, 50, 150]
輸出: [null, false, 42, 1, -1]
解釋:
在 t=0 時(shí),緩存被構(gòu)造。
在 t=0 時(shí),添加一個(gè)鍵值對(duì) (1: 42) ,過(guò)期時(shí)間為 100ms 。因?yàn)樵撝挡淮嬖冢虼朔祷豧alse。
在 t=50 時(shí),請(qǐng)求 key=1 并返回值 42。
在 t=50 時(shí),調(diào)用 count() ,緩存中有一個(gè)未過(guò)期的鍵。
在 t=100 時(shí),key=1 到期。
在 t=150 時(shí),調(diào)用 get(1) ,返回 -1,因?yàn)榫彺媸强盏摹?

示例 2:

輸入:
actions = ["TimeLimitedCache", "set", "set", "get", "get", "get", "count"]
values = [[], [1, 42, 50], [1, 50, 100], [1], [1], [1], []]
timeDelays = [0, 0, 40, 50, 120, 200, 250]
輸出: [null, false, true, 50, 50, -1]
解釋:
在 t=0 時(shí),緩存被構(gòu)造。
在 t=0 時(shí),添加一個(gè)鍵值對(duì) (1: 42) ,過(guò)期時(shí)間為 50ms。因?yàn)樵撝挡淮嬖冢虼朔祷豧alse。
當(dāng) t=40 時(shí),添加一個(gè)鍵值對(duì) (1: 50) ,過(guò)期時(shí)間為 100ms。因?yàn)橐粋€(gè)未過(guò)期的鍵已經(jīng)存在,返回 true 并覆蓋這個(gè)鍵的舊值。
在 t=50 時(shí),調(diào)用 get(1) ,返回 50。
在 t=120 時(shí),調(diào)用 get(1) ,返回 50。
在 t=140 時(shí),key=1 過(guò)期。
在 t=200 時(shí),調(diào)用 get(1) ,但緩存為空,因此返回 -1。
在 t=250 時(shí),count() 返回0 ,因?yàn)榫彺媸强盏?,沒(méi)有未過(guò)期的鍵。

提示:

  • 0 <= key, value <= 109
  • 0 <= duration <= 1000
  • 1 <= actions.length <= 100
  • actions.length === values.length
  • actions.length === timeDelays.length
  • 0 <= timeDelays[i] <= 1450
  • actions[i] 是 "TimeLimitedCache"、"set"、"get" 和 "count" 中的一個(gè)。
  • 第一個(gè)操作始終是 "TimeLimitedCache" 而且一定會(huì)以 0 毫秒的延遲立即執(zhí)行

解題思路

1、構(gòu)造函數(shù) TimeLimitedCache 創(chuàng)建了一個(gè)新的 Map 對(duì)象,并將其賦值給實(shí)例屬性 map

var TimeLimitedCache = function () {
    this.map = new Map();
};

2、set 方法用于向緩存中添加一個(gè)鍵值對(duì),并設(shè)置該鍵值對(duì)的過(guò)期時(shí)間

  • 首先,該方法調(diào)用 get 方法檢查緩存中是否已存在相同的鍵,如果存在,則將返回值 res 設(shè)置為 false,表示未過(guò)期的鍵已經(jīng)存在;
  • 然后,創(chuàng)建一個(gè)包含 exceedTime 和 value 的對(duì)象,其中 exceedTime 表示過(guò)期時(shí)間,通過(guò)當(dāng)前時(shí)間加上指定的持續(xù)時(shí)間計(jì)算得到;
  • 最后,將鍵值對(duì)存儲(chǔ)在 map 中,并返回 res。
TimeLimitedCache.prototype.set = function (key, value, duration) {
    let res = true;
    if(this.get(key) == -1) res = false;
    const obj = {
        exceedTime :new Date().getTime() + duration,
        value
    };
    this.map.set(key,obj);
    return res;
};

3、get 方法用于獲取指定鍵的值

  • 首先,通過(guò)鍵從 map 中獲取對(duì)應(yīng)的值對(duì)象 obj;
  • 如果找不到該鍵,則返回 -1 表示未找到;
  • 然后,獲取值對(duì)象中的過(guò)期時(shí)間 exceedTime;
  • 如果過(guò)期時(shí)間小于等于當(dāng)前時(shí)間,則表示鍵已過(guò)期,返回 -1;
  • 否則,返回值對(duì)象的值。
TimeLimitedCache.prototype.get = function (key) {
    const obj = this.map.get(key);
    if(!obj) return -1;
    const exceedTime = obj.exceedTime;
    if(exceedTime <= new Date().getTime()) return -1;
    return obj.value;
};

4、count 方法用于計(jì)算緩存中未過(guò)期的鍵的數(shù)量

  • 首先,定義一個(gè)變量 cnt 并將其初始化為 0,用于記錄未過(guò)期的鍵的數(shù)量;
  • 獲取當(dāng)前時(shí)間 dateTime;
  • 然后,使用 forEach 方法遍歷 map 中的每個(gè)值對(duì)象 obj;
  • 對(duì)于每個(gè)值對(duì)象,獲取其過(guò)期時(shí)間 exceedTime;
  • 如果過(guò)期時(shí)間大于當(dāng)前時(shí)間,則將計(jì)數(shù)器 cnt 加一;
  • 最后,返回計(jì)數(shù)器 cnt 的值。
TimeLimitedCache.prototype.count = function () {
    let cnt = 0;
    const dateTime = new Date().getTime();
    this.map.forEach(obj=>{
        const exceedTime = obj.exceedTime;
        if(exceedTime > dateTime) cnt++;
    })
    return cnt;
};

AC代碼

var TimeLimitedCache = function () {
    this.map = new Map();
};

/**
 * @param {number} key
 * @param {number} value
 * @param {number} duration time until expiration in ms
 * @return {boolean} if un-expired key already existed
 */
TimeLimitedCache.prototype.set = function (key, value, duration) {
    let res = true;
    if(this.get(key) == -1) res = false;
    const obj = {
        exceedTime :new Date().getTime() + duration,
        value
    };
    this.map.set(key,obj);
    return res;
};

/**
 * @param {number} key
 * @return {number} value associated with key
 */
TimeLimitedCache.prototype.get = function (key) {
    const obj = this.map.get(key);
    if(!obj) return -1;
    const exceedTime = obj.exceedTime;
    if(exceedTime <= new Date().getTime()) return -1;
    return obj.value;
};

/**
 * @return {number} count of non-expired keys
 */
TimeLimitedCache.prototype.count = function () {
    let cnt = 0;
    const dateTime = new Date().getTime();
    this.map.forEach(obj=>{
        const exceedTime = obj.exceedTime;
        if(exceedTime > dateTime) cnt++;
    })
    return cnt;
};

/**
 * const timeLimitedCache = new TimeLimitedCache()
 * timeLimitedCache.set(1, 42, 1000); // false
 * timeLimitedCache.get(1) // 42
 * timeLimitedCache.count() // 1
 */

說(shuō)在后面

到此這篇關(guān)于JavaScrip實(shí)現(xiàn)一個(gè)有時(shí)間限制的緩存類的方式的文章就介紹到這了,更多相關(guān)JavaScrip緩存類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

清丰县| 永川市| 鹿邑县| 林周县| 辽中县| 揭东县| 抚顺县| 蕉岭县| 叶城县| 宁阳县| 林甸县| 龙口市| 霍林郭勒市| 清徐县| 西丰县| 汶上县| 花垣县| 凤庆县| 江孜县| 资兴市| 都昌县| 云浮市| 绵竹市| 伊川县| 灵石县| 轮台县| 富源县| 舞阳县| 大连市| 广汉市| 太康县| 巍山| 元阳县| 信宜市| 乌兰察布市| 桐柏县| 河间市| 禹州市| 镇雄县| 南康市| 玉溪市|