欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(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è)類(lèi),它允許獲取和設(shè)置鍵-值對(duì),并且每個(gè)鍵都有一個(gè) 過(guò)期時(shí)間 。

該類(lèi)有三個(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]
解釋?zhuān)?
在 t=0 時(shí),緩存被構(gòu)造。
在 t=0 時(shí),添加一個(gè)鍵值對(duì) (1: 42) ,過(guò)期時(shí)間為 100ms 。因?yàn)樵撝挡淮嬖?,因此返回false。
在 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]
解釋?zhuān)?
在 t=0 時(shí),緩存被構(gòu)造。
在 t=0 時(shí),添加一個(gè)鍵值對(duì) (1: 42) ,過(guò)期時(shí)間為 50ms。因?yàn)樵撝挡淮嬖?,因此返回false。
當(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í)間限制的緩存類(lèi)的方式的文章就介紹到這了,更多相關(guān)JavaScrip緩存類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript初學(xué)者常用技巧

    javascript初學(xué)者常用技巧

    這篇文章主要介紹了javascript初學(xué)者常用技巧,包括javascript的存放位置、格式及焦點(diǎn)事件等,需要的朋友可以參考下
    2014-09-09
  • JavaScript 棧的詳解及實(shí)例代碼

    JavaScript 棧的詳解及實(shí)例代碼

    這篇文章主要介紹了JavaScript 棧的詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 微信小程序?qū)崿F(xiàn)長(zhǎng)按 識(shí)別圖片二維碼(兩種方案)

    微信小程序?qū)崿F(xiàn)長(zhǎng)按 識(shí)別圖片二維碼(兩種方案)

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)長(zhǎng)按 識(shí)別圖片二維碼(兩種方案),第一種方案只需要在image里面加一個(gè)屬性就可以了,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • js實(shí)現(xiàn)HashTable(哈希表)的實(shí)例分析

    js實(shí)現(xiàn)HashTable(哈希表)的實(shí)例分析

    本文詳細(xì)介紹javascript哈希表的實(shí)例分析及用法。下面就跟小編一起來(lái)學(xué)習(xí)下吧
    2016-11-11
  • JavaScript 中的 `forEach` 無(wú)法退出循環(huán)的解決方案

    JavaScript 中的 `forEach` 無(wú)法退出循環(huán)的解決方案

    在 JavaScript 中,forEach 是一個(gè)數(shù)組方法,它用來(lái)對(duì)數(shù)組中的每個(gè)元素執(zhí)行指定的回調(diào)函數(shù),為了更好地理解這個(gè)問(wèn)題,本文將通過(guò)實(shí)際項(xiàng)目代碼示例,并結(jié)合詳細(xì)的目錄結(jié)構(gòu)來(lái)進(jìn)行講解,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • uniapp獲取頁(yè)面高度與元素高度簡(jiǎn)單示例

    uniapp獲取頁(yè)面高度與元素高度簡(jiǎn)單示例

    在實(shí)際開(kāi)發(fā)中我們會(huì)遇到不確定高度的情況,那么在uniapp中我們?nèi)绾潍@取區(qū)域的高度吶?這篇文章主要給大家介紹了關(guān)于uniapp獲取頁(yè)面高度與元素高度的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • js獲取當(dāng)前頁(yè)面的url網(wǎng)址信息

    js獲取當(dāng)前頁(yè)面的url網(wǎng)址信息

    這篇文章主要介紹了通過(guò)js如何獲取當(dāng)前頁(yè)面的url網(wǎng)址信息,需要的朋友可以參考下
    2014-06-06
  • 如何在uniapp項(xiàng)目中使用mqtt

    如何在uniapp項(xiàng)目中使用mqtt

    本文給大家分享uniapp中引入mqtt的全過(guò)程,在uniapp項(xiàng)目根目錄下分別運(yùn)行安裝mqtt和uuid的命令行,因?yàn)楹竺鏁?huì)用uuid生成mqtt的clientId,文中給大家介紹mqtt和uuid安裝過(guò)程,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2021-05-05
  • 側(cè)欄跟隨滾動(dòng)的簡(jiǎn)單實(shí)現(xiàn)代碼

    側(cè)欄跟隨滾動(dòng)的簡(jiǎn)單實(shí)現(xiàn)代碼

    側(cè)欄里的有些內(nèi)容滾動(dòng)到頁(yè)面頂端以后就固定在那個(gè)位置,不再跟隨滾動(dòng)條而滾動(dòng),想必很多站長(zhǎng)朋友都想實(shí)現(xiàn)這個(gè)效果吧,接下來(lái)為大家詳細(xì)介紹下,感興趣的你可不要錯(cuò)過(guò)了哈
    2013-03-03
  • Makefile/cmake/node-gyp中區(qū)分判斷不同平臺(tái)的方法

    Makefile/cmake/node-gyp中區(qū)分判斷不同平臺(tái)的方法

    今天小編就為大家分享一篇關(guān)于Makefile/cmake/node-gyp中區(qū)分判斷不同平臺(tái)的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12

最新評(píng)論