localStorage实现带过期时间的缓存功能

作者:巡夜人

时间:2026-10-23

浏览:394

本文介绍如何利用localStorage实现带过期时间的缓存功能。通过对比Cookie和SessionStorage,分析localStorage的优势与局限。详细讲解在保存、读取和移除数据时,如何通过额外存储时间戳来管理缓存有效期,并提供完整的JavaScript实现代码,帮助开发者优化前端数据缓存策略。

文章目录

前言与存储方式对比

前言

在浏览器端实现数据缓存,通常可选用Cookie、localStorage或sessionStorage,主要目的是降低对服务器的请求频率。

Cookie数据存储在本地硬盘中,只要在设定的过期时间之前,即使重启浏览器也能保持有效。然而,Cookie会在每次HTTP请求中自动附加到请求头里,如果数据量过大,可能会引发性能问题。

sessionStorage将数据保存在浏览器内存中,一旦页面关闭或浏览器退出,其中的信息便会丢失。

localStorage同样将数据保存在本地硬盘中,除非用户主动清除,否则信息不会消失。但在实际应用中,往往需要为缓存设置过期时间,本文将重点讲解如何为localStorage添加这一功能。

这三种存储方式均仅支持同源(主机名+端口号)的数据访问,不同源的数据无法相互读取。

localStorage基础操作

localStorage

localStorage支持以下操作方法:

  • 保存数据:使用localStorage.setItem(key, value);
  • 读取数据:使用localStorage.getItem(key);
  • 删除单个数据:使用localStorage.removeItem(key);
  • 删除所有数据:使用localStorage.clear();
  • 获取指定索引的key:使用localStorage.key(index);

需要注意的是,localStorage仅支持String类型数据的直接读取。如果存入的是数值类型,读取时会变成字符串;若需存储对象类型,必须在保存前将其JSON化为String类型。

对于缓存管理,我们通常采用以下策略:

带过期时间的缓存实现


set(key,value,expiredTime);
get(key);
remove(key);
expired(key,expiredTime);
clear(); 

实现

设置缓存

为了实现过期时间控制,除了存储原始值的缓存键(key)外,还需额外添加两个缓存键:(key+EXPIRED:TIME)用于存储过期时长,以及(key+EXPIRED:START:TIME)用于记录缓存设置时的具体时间戳。

在读取数据时,将(过期时间+设置缓存时的时间戳)与当前系统时间进行对比。如果前者大于当前时间,则说明缓存尚未过期。

注意这里使用JSON.stringify对存入的对象进行JSON化。读取时也需要将其转换回原始对象。


"key":{
    //辅助
    "expiredTime": "EXPIRED:TIME",
    "expiredStartTime": "EXPIRED:START:TIME",
    //全局使用
    //用户信息
    "loginUserInfo": "USER:INFO",
    //搜索字段
    "searchString": "SEARCH:STRING",
  },
  /**
   * 设置缓存
   * @param key
   * @param value
   * @param expiredTimeMS 过期时间,单位ms
   */
  "set":function (key,value,expiredTimeMS) {
    if((expiredTimeMS == 0 ) || (expiredTimeMS == null)){
      localStorage.setItem(key,value);
    }
    else {
      localStorage.setItem(key,JSON.stringify(value));
      localStorage.setItem(key+cache.key.expiredTime,expiredTimeMS);
      localStorage.setItem(key+cache.key.expiredStartTime,new Date().getTime());
    }
  },

读取缓存

由于从localStorage读取出的时间信息是字符串格式,需要将其转换为数字后再进行比较。


/**
   * 获取键
   * @param key
   * @returns {*} key存在,返回对象;不存在,返回null
   */
  "get":function (key) {
    var expiredTimeMS = localStorage.getItem(key+cache.key.expiredTime);
    var expiredStartTime = localStorage.getItem(key+cache.key.expiredStartTime);
    var curTime = new Date().getTime();
    var sum = Number(expiredStartTime) + Number(expiredTimeMS);
    if((sum) > curTime){
      console.log("cache-缓存["+key+"]存在!");
      return JSON.parse(localStorage.getItem(key));
    }
    else {
      console.log("cache-缓存["+key+"]不存在!");
      return null;
    }
  },

移除缓存

在移除缓存时,需要同时移除这三个相关的键值对。


/**
   * 移除键
   * @param key
   */
  "remove":function (key) {
    localStorage.removeItem(key);
    localStorage.removeItem(key+cache.key.expiredTime);
    localStorage.removeItem(key+cache.key.expiredStartTime);
  },

其他代码


/**
   * 对键重新更新过期时间
   * @param key
   * @param expiredTimeMS 过期时间ms
   */
  "expired":function (key,expiredTimeMS) {

    if(cache.get(key)!=null){
      localStorage.setItem(key+cache.key.expiredTime,expiredTimeMS);
    }

  },
  /**
   * 清除所有缓存
   */
  "clear":function () {
    localStorage.clear();
  }

总结

总结

以上介绍了利用localStorage实现带过期时间缓存功能的方法,希望对大家有所帮助。如果大家有任何疑问,欢迎留言,小编会及时回复大家!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章