JavaScript實現支持過期時間的數據緩存功能
更新時間:2025年01月07日 11:10:58 作者:飛仔FeiZai
這篇文章主要為大家詳細介紹了如何使用JavaScript實現支持過期時間的數據緩存功能,文中的示例代碼講解詳細,感興趣的小伙伴可以參考下
要在 JavaScript 中實現數據緩存功能并支持設置過期時間,可以使用 localStorage
、sessionStorage
或內存對象(如 Map
或普通對象)來存儲數據,并為每個緩存項設置一個過期時間。以下是一個簡單的實現示例:
JavaScript 實現支持過期時間的數據緩存功能
1. 使用 localStorage 實現持久緩存
const Cache = { /** * 設置緩存 * @param {string} key - 緩存鍵 * @param {*} value - 緩存值 * @param {number} ttl - 緩存時間(毫秒) */ set(key, value, ttl) { const data = { value, expiry: ttl ? Date.now() + ttl : null, // 計算過期時間 }; localStorage.setItem(key, JSON.stringify(data)); }, /** * 獲取緩存 * @param {string} key - 緩存鍵 * @returns {*} 緩存值或 null(如果過期或不存在) */ get(key) { const data = localStorage.getItem(key); if (!data) return null; try { const { value, expiry } = JSON.parse(data); if (expiry && Date.now() > expiry) { localStorage.removeItem(key); // 過期刪除緩存 return null; } return value; } catch (e) { console.warn("緩存數據解析失敗", e); return null; } }, /** * 刪除緩存 * @param {string} key - 緩存鍵 */ remove(key) { localStorage.removeItem(key); }, /** * 清空所有緩存 */ clear() { localStorage.clear(); }, }; // 使用示例 Cache.set("username", "Alice", 5000); // 設置緩存5秒后過期 console.log(Cache.get("username")); // 5秒內返回 'Alice' setTimeout(() => console.log(Cache.get("username")), 6000); // 6秒后返回 null
注意事項
localStorage
只能存儲字符串,因此要使用JSON.stringify
和JSON.parse
進行序列化和反序列化。localStorage
的存儲空間一般有限(大約 5MB)。- 如果是跨頁面使用,請確保在相同的域名下。
2. 使用 sessionStorage 實現數據緩存(適合頁面級臨時存儲)
sessionStorage
是一種瀏覽器存儲機制,它的特點是數據僅在頁面會話(session)期間有效,頁面關閉后數據會被清除。
const SessionCache = { /** * 設置緩存 * @param {string} key - 緩存鍵 * @param {*} value - 緩存值 * @param {number} ttl - 緩存時間(毫秒) */ set(key, value, ttl) { const data = { value, expiry: ttl ? Date.now() + ttl : null, // 計算過期時間 }; sessionStorage.setItem(key, JSON.stringify(data)); }, /** * 獲取緩存 * @param {string} key - 緩存鍵 * @returns {*} 緩存值或 null(如果過期或不存在) */ get(key) { const data = sessionStorage.getItem(key); if (!data) return null; try { const { value, expiry } = JSON.parse(data); if (expiry && Date.now() > expiry) { sessionStorage.removeItem(key); // 緩存已過期,刪除 return null; } return value; } catch (e) { console.warn("緩存數據解析失敗:", e); return null; } }, /** * 刪除緩存 * @param {string} key - 緩存鍵 */ remove(key) { sessionStorage.removeItem(key); }, /** * 清空所有緩存 */ clear() { sessionStorage.clear(); }, }; // **使用示例** // 設置緩存,5秒后過期 SessionCache.set("userToken", "abc123", 5000); // 獲取緩存 console.log(SessionCache.get("userToken")); // 5秒內返回 'abc123' // 5秒后嘗試獲取緩存 setTimeout(() => { console.log(SessionCache.get("userToken")); // 返回 null }, 6000);
注意事項
sessionStorage
數據在頁面關閉或會話結束時自動清除。- 在不同的標簽頁中,
sessionStorage
是獨立的(不會共享)。 sessionStorage
的存儲空間一般為5MB左右。- 數據存儲在
sessionStorage
時必須經過JSON.stringify
和JSON.parse
處理。
3. 使用內存對象實現輕量緩存(適合短期緩存)
class MemoryCache { constructor() { this.cache = new Map(); } /** * 設置緩存 * @param {string} key - 緩存鍵 * @param {*} value - 緩存值 * @param {number} ttl - 緩存時間(毫秒) */ set(key, value, ttl) { const expiry = ttl ? Date.now() + ttl : null; this.cache.set(key, { value, expiry }); } /** * 獲取緩存 * @param {string} key - 緩存鍵 * @returns {*} 緩存值或 null(如果過期或不存在) */ get(key) { const item = this.cache.get(key); if (!item) return null; if (item.expiry && Date.now() > item.expiry) { this.cache.delete(key); // 緩存過期,刪除 return null; } return item.value; } /** * 刪除緩存 * @param {string} key - 緩存鍵 */ remove(key) { this.cache.delete(key); } /** * 清空所有緩存 */ clear() { this.cache.clear(); } } // 使用示例 const memCache = new MemoryCache(); memCache.set("token", "abc123", 3000); // 設置緩存3秒后過期 console.log(memCache.get("token")); // 3秒內返回 'abc123' setTimeout(() => console.log(memCache.get("token")), 4000); // 4秒后返回 null
三種方式對比
特性 | localStorage | sessionStorage | 內存緩存 (Map) |
---|---|---|---|
持久性 | 持久存儲,頁面刷新或關閉后仍保留 | 頁面會話結束(即關閉頁面)時丟失 | 頁面刷新后丟失 |
共享性 | 同一域名下所有頁面共享 | 僅當前標簽頁可用 | 僅當前標簽頁可用 |
性能 | 讀取稍慢(I/O 操作) | 讀取稍慢(I/O 操作) | 更快(內存存取) |
適用場景 | 長期存儲、頁面級數據 | 臨時存儲頁面狀態(tài)、會話數據 | 短期存儲、臨時數據 |
存儲大小限制 | 約 5MB | 約 5MB | 取決于可用內存 |
到此這篇關于JavaScript實現支持過期時間的數據緩存功能的文章就介紹到這了,更多相關JavaScript數據緩存內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Bootstrap下拉菜單更改為懸停(hover)觸發(fā)的方法
這篇文章主要為大家詳細介紹了Bootstrap下拉菜單更改為懸停(hover)觸發(fā)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05