采用localStorage做定时缓存
背景
页面采用ajax获取数据时,每访问一次就会发送一次请求向服务端获取数据,可是呢。 有些数据更新的又不频繁,所以我就想着使用localStorage进行本地存储,然后在固定间隔时在去更新数据。(下载地址:https://gitee.com/whnba/data_storage)
结构设计
expires:用于保存数据到期时间
data:用于保存数据
- {
- expires: "到期时间"
- data:"数据"
- }
设置缓存数据
采用JSON把数据结构进行序列化保存,如果数据满了就全部清空吧。不然怎么办
- static set(key, value, expires = 3600) {
- const date = new Date();
- try {
- localStorage.setItem(key, JSON.stringify({
- expires: date.valueOf() + expires * 1000,
- data: value
- }));
- } catch (e) {
- if (e.name === 'QuotaExceededError') {
- console.log("数据已满,自动清空");
- Cache.clear();
- Cache.set(key, value, expires);
- }
- }
- }
获取缓存数据
先判断数据是否到期,如果没有到期就返回数据,反之删除。
- static get(key) {
- const result = JSON.parse(localStorage.getItem(key));
- const date = new Date();
- if (result && result.expires > date) {
- return result.data;
- } else {
- Cache.remove(key);
- return null;
- }
- }
完整代码
- /**
- * 数据缓存
- */
- class Cache {
- /**
- * 获取缓存
- * @param key
- * @return {any}
- */
- static get(key) {
- const result = JSON.parse(localStorage.getItem(key));
- const date = new Date();
- if (result && result.expires > date) {
- return result.data;
- } else {
- Cache.remove(key);
- return null;
- }
- }
- /**
- * 设置缓存
- * @param {String} key 键名
- * @param {any} value 缓存数据
- * @param {Number} expires 过期时间 单位 s
- */
- static set(key, value, expires = 3600) {
- const date = new Date();
- try {
- localStorage.setItem(key, JSON.stringify({
- expires: date.valueOf() + expires * 1000,
- data: value
- }));
- } catch (e) {
- if (e.name === 'QuotaExceededError') {
- console.log("数据已满,自动清空");
- Cache.clear();
- Cache.set(key, value, expires);
- }
- }
- }
- /**
- * 删除键
- * @param key
- */
- static remove(key) {
- localStorage.removeItem(key);
- }
- /**
- * 清空
- */
- static clear() {
- localStorage.clear();
- }
- }
- export default Cache;
采用localStorage做定时缓存的更多相关文章
- localstorage本地定时缓存
在做一个网站时,起初直接就是从服务器获取数据进行交互,没有用一些本地缓存做优化,项目做下来就特别卡,并且对服务器造成了很大的压力,经过请教,查询,找到这样一个定时缓存的例子.html5定时缓存,从数据 ...
- web性能优化之--合理使用http缓存和localStorage做资源缓存
一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...
- 面localStorage用作数据缓存的简易封装
面localStorage用作数据缓存的简易封装 最近做了一些前端控件的封装,需要用到数据本地存储,开始采用cookie,发现很容易就超过了cookie的容量限制,于是改用localStorage,但 ...
- 《前端之路》之 Cookie && localStorage && Session Storage 缓存相关
08: Cookie && localStorage && Session Storage 缓存相关 客户端.前端 存储 一. 起 因 首先解释下为什么想来写这个关于前 ...
- Stack Overflow是如何做应用缓存的
首先要说下缓存是什么?缓存,就是在取出数据结果后,暂时将数据存储在某些可以快速存取的位置(例如各种NoSQL如Redis,HBase,又或MemoryCache等等),于是就可以让这些耗时的数据结果多 ...
- spring boot:使用caffeine+redis做二级缓存(spring boot 2.3.1)
一,为什么要使用二级缓存? 我们通常会使用caffeine做本地缓存(或者叫做进程内缓存), 它的优点是速度快,操作方便,缺点是不方便管理,不方便扩展 而通常会使用redis作为分布式缓存, 它的优点 ...
- 怎么用php语言来做文件缓存
使用缓存能够让我们的程序访问起来更加快速,缓存可以减少对数据库的操作,体验起来更好一些,对服务器的压力也小一些,当然服务速度很快 php文件执行完之后产生的解析完的数据,保存成静态的网页,下次打开的这 ...
- .NET WebAPI 采用 IDistributedCache 实现分布式缓存过滤器 Redis 模式
分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...
- 使用redis做mysql缓存
应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql. 同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增 ...
随机推荐
- Leetcode: Rotated Digits
X is a good number if after rotating each digit individually by 180 degrees, we get a valid number t ...
- Win10 x64 pnglib Release
Win10 x64 pnglib Release >------ 已启动生成: 项目: ZERO_CHECK, 配置: Release x64 ------ > Checking Buil ...
- Qt编写气体安全管理系统13-短信告警
一.前言 短信告警这个模块在很多项目中都用上了,比如之前做过的安防系统,温湿度报警系统等,主要的流程就是收到数据判断属于某种报警后,组织短信字符串内容,发送到指定的多个手机号码上面,使用的是短信猫硬件 ...
- matlab基本函数find
一起来学演化计算-matlab基本函数find 觉得有用的话,欢迎一起讨论相互学习~Follow Me 找到非零元素的索引和值 语法 k = find(X) k = find(X)返回一个向量,其中包 ...
- Slf4j与log4j及log4j2、logbak的关系及使用方法
Slf4j与log4j及log4j2的关系及使用方法 slf4j slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独 ...
- react 生命周期图解
参考地址:https://www.cnblogs.com/gdsblog/p/7348375.html
- Java进阶教程:使用Lombok提升开发效率
Java进阶教程:使用Lombok提升开发效率 Lombok Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO).它通过注释实现这 ...
- RabbitMQ官方教程二 Work Queues(GOLANG语言实现)
RabbitMQ官方教程二 Work Queues(GOLANG语言实现) 在第一个教程中,我们编写了程序来发送和接收来自命名队列的消息. 在这一部分中,我们将创建一个工作队列,该队列将用于在多个wo ...
- idea安装阿里云插件和sonar插件
重启idea
- linux input子系统详解
首先,什么是linux的子系统: 输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动通过Driver->Input core->Event handler- ...