前言

一般可以使用cookie,localstorage,sessionStorage来实现浏览器端的数据缓存,减少对服务器的请求。

1.cookie数据存放在本地硬盘中,只要在过期时间之前,都是有效的,即使重启浏览器。但是会在每次HTTP请求中添加到请求头中,如果数据过多,会造成性能问题。

2.sessionStorage保存在浏览器内存中,当关闭页面或者浏览器之后,信息丢失。

3.localstorage也是保存在本地硬盘中,除非主动清除,信息是不会消失的。但是实际使用时我们需要对缓存设置过期时间,本文便是讲解如何为localstorage添加过期时间功能。

这三者仅支持同源(host+port)的数据,不同源的数据不能互相访问到。

localstorage

localstorage支持以下方法

  1. 保存数据:localStorage.setItem(key,value);
  2. 读取数据:localStorage.getItem(key);
  3. 删除单个数据:localStorage.removeItem(key);
  4. 删除所有数据:localStorage.clear();
  5. 得到某个索引的keylocalStorage.key(index);

需要注意的是,仅支持String类型数据的读取,如果存放的是数值类型,读出来的是字符串类型的,对于存储对象类型的,需要在保存之前JSON化为String类型。

对于缓存,我们一般有以下方法

  1. set(key,value,expiredTime);
  2. get(key);
  3. remove(key);
  4. expired(key,expiredTime);
  5. clear();

实现

设置缓存

对于过期时间的实现,除了用于存放原始值的缓存(key),这里添加了两个缓存(key+EXPIRED:TIME)和(key+EXPIRED:START:TIME),一个用于存放过期时间,一个用于存放缓存设置时的时间。

当读取的时候比较 (过期时间+设置缓存的时间)和当前的时间做对比。如果(过期时间+设置缓存时的时间)大于当前的时间,则说明缓存没过期。

注意这里使用JSON.stringify对存入的对象JSON化。读取的时候也要转回原始对象。

  1. "key":{
  2. //辅助
  3. "expiredTime": "EXPIRED:TIME",
  4. "expiredStartTime": "EXPIRED:START:TIME",
  5. //全局使用
  6. //用户信息
  7. "loginUserInfo": "USER:INFO",
  8. //搜索字段
  9. "searchString": "SEARCH:STRING",
  10.  
  11. },
  12. /**
  13. * 设置缓存
  14. * @param key
  15. * @param value
  16. * @param expiredTimeMS 过期时间,单位ms
  17. */
  18. "set":function (key,value,expiredTimeMS) {
  19.  
  20. if((expiredTimeMS == 0 ) || (expiredTimeMS == null)){
  21. localStorage.setItem(key,value);
  22. }
  23. else {
  24.  
  25. localStorage.setItem(key,JSON.stringify(value));
  26. localStorage.setItem(key+cache.key.expiredTime,expiredTimeMS);
  27. localStorage.setItem(key+cache.key.expiredStartTime,new Date().getTime());
  28. }
  29.  
  30. },

读取缓存

由于读取出来的是时间信息是字符串,需要将其转化为数字再进行比较。

  1. /**
  2. * 获取键
  3. * @param key
  4. * @returns {*} key存在,返回对象;不存在,返回null
  5. */
  6. "get":function (key) {
  7.  
  8. var expiredTimeMS = localStorage.getItem(key+cache.key.expiredTime);
  9. var expiredStartTime = localStorage.getItem(key+cache.key.expiredStartTime);
  10. var curTime = new Date().getTime();
  11.  
  12. var sum = Number(expiredStartTime) + Number(expiredTimeMS);
  13.  
  14. if((sum) > curTime){
  15. console.log("cache-缓存["+key+"]存在!");
  16. return JSON.parse(localStorage.getItem(key));
  17. }
  18. else {
  19. console.log("cache-缓存["+key+"]不存在!");
  20. return null;
  21. }
  22.  
  23. },

移除缓存

移除缓存时需要把三个键同时移除。

  1. /**
  2. * 移除键
  3. * @param key
  4. */
  5. "remove":function (key) {
  6. localStorage.removeItem(key);
  7. localStorage.removeItem(key+cache.key.expiredTime);
  8. localStorage.removeItem(key+cache.key.expiredStartTime);
  9. },

其他代码

  1. /**
  2. * 对键重新更新过期时间
  3. * @param key
  4. * @param expiredTimeMS 过期时间ms
  5. */
  6. "expired":function (key,expiredTimeMS) {
  7.  
  8. if(cache.get(key)!=null){
  9. localStorage.setItem(key+cache.key.expiredTime,expiredTimeMS);
  10. }
  11.  
  12. },
  13. /**
  14. * 清除所有缓存
  15. */
  16. "clear":function () {
  17. localStorage.clear();
  18. }

本文完整代码缓存

====

localstorage实现带过期时间的缓存功能的更多相关文章

  1. java实现带过期时间的缓存

    private static ScheduledExecutorService swapExpiredPool = new ScheduledThreadPoolExecutor(10); priva ...

  2. 如何给localStorage设置一个过期时间?

    原文:如何给localStorage设置一个过期时间? 作者:苏南 - 首席填坑官 公众号:IT平头哥联盟 Fundebug经授权转载,版权归原作者所有. 引言 这个话题其实在上次分享已经讲过(大佬可 ...

  3. IIS使用十大原则,(IIS过期时间,IIS缓存设置) 【转载】

    1. 自定义错误页虽然自定义错误页很简单,但只有少数管理员有效地利用了它.管理员可以在MMC中将HTTP错误信息映像到服务器上的绝对URL或是某个文件,更为详细的信息可以在这里找到.如果你嫌这太麻烦, ...

  4. redis 过期时间与缓存

    设置过期时间 redis对于存储的键值可以设置过期时间,对于过期了的键值,redis会自动删除. > OK > get price " > expire price (in ...

  5. Redis -- 过期时间 和 缓存 例子

    1.设置 key的生存时间,过期自动删除 exprire key  seconds    设置过期时间 秒数 ttl key   查询剩余时间 如果 设置了过期时间.对key进行 set 操作,会清除 ...

  6. [置顶] 页面缓存,cache,设置缓存过期时间,OutputCache

    页面缓存 方法一: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //缓存有数据 if (Cach ...

  7. 阿里面试官让我实现一个线程安全并且可以设置过期时间的LRU缓存,我蒙了!

    目录 1. LRU 缓存介绍 2. ConcurrentLinkedQueue简单介绍 3. ReadWriteLock简单介绍 4.ScheduledExecutorService 简单介绍 5. ...

  8. 利用GUID唯一标识符并设置它的过期时间

    项目中遇到一个小问题,就是把服务器创建的GUID发送给客户端,客户端接收后,下次访问时带上这个GUID, 服务端这边就进行验证,并做相应的处理. 问题是:项目中还需要这个GUID带过期时间,那是如何设 ...

  9. 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透

    前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...

随机推荐

  1. Linux命令list

    文件和目录 cd /home 进入 '/ home' 目录' cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 cd - 返回 ...

  2. Callable,Runnable异同

    1.Runnable和Callable的区别 (1) Callable规定的方法是 call(), Runnable规定的方法是 run(). (2) Callable的任务执行后可返回值,而 Run ...

  3. 零元学Expression Design 4 - Chapter 1 入门界面简介

    原文:零元学Expression Design 4 - Chapter 1 入门界面简介 Expression Design 是Expression系列里面的一员,更是Blend跟Web的好帮手 而在 ...

  4. git 命令修改commit时的用户名和邮箱地址

    1.介绍 在git的用户名和邮箱是有一个仓库和全局之分的,在利用vs插件是也有显示:

  5. AWS核心服务概览

    1.Amazon Web Service 应该可以说,Amazon Web Service目前是云计算领域的领头羊,其业务规模.开发水平和盈利能力在业界内都是首屈一指的.从本科毕业离开学校就一直做Ja ...

  6. SSM导出报表为csv文件

    报表导出思路为,在后台用iDataReader将查询得到的数据写进文件并压缩,向前端返回文件位置的链接,在前端执行下载操作. web端: 1. ajax请求url,将返回的路径json字符串解析并执行 ...

  7. Angular使用echarts

    安装 npm install echarts --save npm install @types/echarts --save 基本使用 定义一个dom <div id="chart& ...

  8. ASP .NET DropDownList多级联动事件

    思路 假如有三级省.市.区,先加载出所有省选择省之后,加载出该省所有市选择市之后,加载出该市所有区重新选择省,则清空市和区重新选择市,则清空区想好数据结构,不同的数据结构做法不同 例子 数据结构 pu ...

  9. Selenium-基础操作

    一.测试代码 @Test public void test() { WebDriver driver = new FirefoxDriver(); // 打开当前包中的index页面 driver.g ...

  10. AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享

    原文:AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享 ====================www.ayjs.net       杨洋    wpfui.com      ...