localStorage简介

使用localStorage可以在浏览器中存储键值对的数据。经常被和localStorage一并提及的是sessionStorage,它们都可以在当浏览器中存储键值对的数据。但是它们之间的区别是:存储在localStorage的数据可以长期保留;而当页面会话结束(也就是当页面被关闭)时,存储在sessionStorage的数据会被清除。

另外需要注意的是,localStorage中的键值对总是以字符串的形式存储,并且只能访问当前域名下的数据,不能跨域名访问。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

localStorage方法

可以通过setItem方法增加了一个键值对数据,比如:

  1. localStorage.setItem('name', 'OneMore');

如果该键已经存在,那么该键对应的值将被覆盖。还可以使用getItem方法读取对应键的值数据,比如:

  1. var name = localStorage.getItem('name');

可以使用removeItem方法移除对应的键,比如:

  1. localStorage.removeItem('name');

也可以使用clear方法移除当前域名下所有的键值对数据,比如:

  1. localStorage.clear();

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

可过期的localStorage缓存

正如上面所提到的,localStorage只能用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去删除。所以要实现可过期的localStorage缓存的中重点就是:如何清理过期的缓存?

惰性删除

惰性删除是指,某个键值过期后,该键值不会被马上删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。我们先来简单实现一下:

  1. var lsc = (function (self) {
  2. var prefix = 'one_more_lsc_'
  3. /**
  4. * 增加一个键值对数据
  5. * @param key 键
  6. * @param val 值
  7. * @param expires 过期时间,单位为秒
  8. */
  9. self.set = function (key, val, expires) {
  10. key = prefix + key;
  11. val = JSON.stringify({'val': val, 'expires': new Date().getTime() + expires * 1000});
  12. localStorage.setItem(key, val);
  13. };
  14. /**
  15. * 读取对应键的值数据
  16. * @param key 键
  17. * @returns {null|*} 对应键的值
  18. */
  19. self.get = function (key) {
  20. key = prefix + key;
  21. var val = localStorage.getItem(key);
  22. if (!val) {
  23. return null;
  24. }
  25. val = JSON.parse(val);
  26. if (val.expires < new Date().getTime()) {
  27. localStorage.removeItem(key);
  28. return null;
  29. }
  30. return val.val;
  31. };
  32. return self;
  33. }(lsc || {}));

上述代码通过惰性删除已经实现了可过期的localStorage缓存,但是也有比较明显的缺点:如果一个key一直没有被用到,即使它已经过期了也永远存放在localStorage。为了弥补这样缺点,我们引入另一种清理过期缓存的策略。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

定时删除

定时删除是指,每隔一段时间执行一次删除操作,并通过限制删除操作执行的次数和频率,来减少删除操作对CPU的长期占用。另一方面定时删除也有效的减少了因惰性删除带来的对localStorage空间的浪费。

每隔一秒执行一次定时删除,操作如下:

  1. 随机测试20个设置了过期时间的key。
  2. 删除所有发现的已过期的key。
  3. 若删除的key超过5个则重复步骤1,直至重复500次。

具体实现如下:

  1. var lsc = (function (self) {
  2. var prefix = 'one_more_lsc_'
  3. var list = [];
  4. //初始化list
  5. self.init = function () {
  6. var keys = Object.keys(localStorage);
  7. var reg = new RegExp('^' + prefix);
  8. var temp = [];
  9. //遍历所有localStorage中的所有key
  10. for (var i = 0; i < keys.length; i++) {
  11. //找出可过期缓存的key
  12. if (reg.test(keys[i])) {
  13. temp.push(keys[i]);
  14. }
  15. }
  16. list = temp;
  17. };
  18. self.init();
  19. self.check = function () {
  20. if (!list || list.length == 0) {
  21. return;
  22. }
  23. var checkCount = 0;
  24. while (checkCount < 500) {
  25. var expireCount = 0;
  26. //随机测试20个设置了过期时间的key
  27. for (var i = 0; i < 20; i++) {
  28. if (list.length == 0) {
  29. break;
  30. }
  31. var index = Math.floor(Math.random() * list.length);
  32. var key = list[index];
  33. var val = localStorage.getItem(list[index]);
  34. //从list中删除被惰性删除的key
  35. if (!val) {
  36. list.splice(index, 1);
  37. expireCount++;
  38. continue;
  39. }
  40. val = JSON.parse(val);
  41. //删除所有发现的已过期的key
  42. if (val.expires < new Date().getTime()) {
  43. list.splice(index, 1);
  44. localStorage.removeItem(key);
  45. expireCount++;
  46. }
  47. }
  48. //若删除的key不超过5个则跳出循环
  49. if (expireCount <= 5 || list.length == 0) {
  50. break;
  51. }
  52. checkCount++;
  53. }
  54. }
  55. //每隔一秒执行一次定时删除
  56. window.setInterval(self.check, 1000);
  57. return self;
  58. }(lsc || {}));

完整源码及使用示例

完整源码及使用示例已上传到我的GitHubhttps://github.com/heihaozi/LocalStorageCache)上,感谢各位小伙伴的Star和Fork。

总结

一种策略可能会有自己的缺点,为了规避相应的缺点,我们可以合理运用多种策略,扬长避短就得到接近完美的解决方案。

微信公众号:万猫学社

微信扫描二维码

获得更多Java技术干货

运用惰性删除和定时删除实现可过期的localStorage缓存的更多相关文章

  1. Window bat expdp 定时任务逻辑备份 定时删除N天前的旧文件

    点击进入:Linux shell crontab expdp 定时任务逻辑备份 定时删除旧文件 首先建一个备份数据库用批处理文件,内容如下: rem expdp sz set sz_file=SZ_% ...

  2. Linux shell crontab expdp 定时任务逻辑备份 定时删除旧文件

    点击进入:Window bat expdp 定时任务逻辑备份 定时删除N天前的旧文件 创建sh脚本 [oracle@localhost ~]$ vi logicbackup.sh 添加脚本内容 #!/ ...

  3. powershell 定时删除脚本

    powershell  定时删除脚本 $today=Get-Date #"今天是:$today" #昨天 #"昨天是:$($today.AddDays(-1))" ...

  4. mongodb系列~mongodb定时删除数据

    一 简介:本文介绍创建自动删除数据的TTL索引 二 目的 定时删除数据三 创建方法   db.collection.createIndex(keys, options)   options:   ex ...

  5. 【转】ElasticSearch之定时删除数据

    有的时候我们在使用ES时,由于资源有限或业务需求,我们只想保存最近一段时间的数据,所以有如下脚本可以定时删除数据 delete_es_by_day.sh #!/bin/sh # example: in ...

  6. 【shell】定时删除DB2表数据

    使用db2的时候,有时候需要对表数据进行删除,防止数据太多,造成数据库空间满了 以下是一个定时删除表tmp,tm1中id为1的数据的脚本 #!/bin/sh ##------------------- ...

  7. Linux中定时删除超过指定大小的文件夹

    背景: 开发环境总是动不动就没有空间了, 大部分都是debug日志.所以有必要在日志很疯狂的时候,删除不必要的日志. 思路:一. 书写删除日志文件脚本: 定时任务执行.  但是有时候的日志是需要保存用 ...

  8. Windows 定时删除指定路径下N天前的日志文件

    Windows 定时删除指定路径下N天前的日志文件 Windows 下bat脚本文件的内容为 1. 删除指定路径下5天前的所有文件 @echo off set SrcDir=E:\WORK\Git s ...

  9. mongodb定时删除数据(索引删除)

    一 简介:本文介绍创建自动删除数据的TTL索引 二 目的 定时删除数据三 创建方法   db.collection.createIndex(keys, options)   options:   ex ...

随机推荐

  1. MySQL(二)MySQL中的存储引擎

    前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...

  2. 使用RSS订阅喜欢的微博博主

    获取uid方法:进入博主微博主页,使用控制台执行 /uid=(\d+)/. exec(document.querySelector('.opt_box .btn_bed').getAttribute( ...

  3. 软路由OpenWrt(LEDE)2020.5.10更新 UPnP+NAS+多拨+网盘+DNS优化

    近期更新:2020.05.10更新-基于OpenWrt R2020.5.9版本,源码截止2020.05.10.   交流群:QQ 1030484865 电报 t.me/t_homelede   版本说 ...

  4. 移动端H5支付(微信和支付宝)

    我们直接进入主题吧,先说功能: 1.用户通过我们的页面输入充值帐号和金额调起支付(微信或者支付宝),支付成功返回获取支付结果. 2.微信支付成功后重定向到指定页面(没有设置重定向地址的话,默认返回调起 ...

  5. CF-234 F. Fence DP

    F. Fence 这个刷Fence的问题看到好几个了... 题意 有一个栅栏,由n块宽为1cm的木板组成,第i块木板高为hi,要给他们刷上油漆,有一桶红色的可以刷a平方厘米的油漆,一桶绿色的可以刷b平 ...

  6. 02JAVA基础-运算符及选择语句

    一.运算符 1.算数运算符 算数运算符 备注 + 可以用作拼接 - * / 整数相除得整数,需要获得小数,需一方为浮点数 % 取余数 ++ 自增 -- 自减 扩展(1) 对于++和--的扩展(以++为 ...

  7. css3盒子flex

    一.定义在容器上的属性有6个: 1.flex-direction: 决定主轴的方向,即项目的排列方向. 属性值:row.row-reverse.column.column-reverse: 2.fle ...

  8. Spring全家桶之spring boot(五)

    Thymeleaf简介 Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,模板引擎是一个技术名词,是跨领域跨平台的概念,在Java语言体系下有模板引擎,在C#.PHP语言体系下也 ...

  9. 我的第一篇博客-学习书写markdown

    Markdown学习(标题:井号+空格+标题名字 回车 ) 标题: 二级标题## 空格+名字 三级标题### 空格+名字 四级标题#### 空格+名字 五级标题##### 空格+名字 六级标题#### ...

  10. centos7 下安装apache mysql php phpmyadmin。

    1 安装mysql yum -y install mariadb-server systemctl start mariadb.service systemctl enable mariadb.ser ...