当前位置: 首页 > article >正文

localStorage缓存 接口 配置

localStorage缓存 接口 配置

  • 封装缓存函数
  • 接口缓存
  • 配置缓存

封装缓存组件 统一管理缓存设置 减少请求 优化逻辑

封装缓存函数

缓存的键和时间也可以放在一起,更好统一管理。

// 缓存键前缀
const PREFIX = 'diamond_'

// 缓存时间配置(毫秒)
const CACHE_TIME = {
  SHORT: 5 * 60 * 1000,        // 5分钟
  MEDIUM: 30 * 60 * 1000,      // 30分钟
  LONG: 24 * 60 * 60 * 1000,   // 1天
  WEEK: 7 * 24 * 60 * 60 * 1000 // 1周
}

// 缓存版本号,用于缓存更新
const CACHE_VERSION = '1.0.0'

export const cache = {
  // 设置缓存 默认过期时间30分钟
  set(key, value, expire = CACHE_TIME.MEDIUM) {
    const data = {
      value,
      expire: expire ? Date.now() + expire : null,
      version: CACHE_VERSION
    }
    try {
      localStorage.setItem(PREFIX + key, JSON.stringify(data))
      return true
    } catch (e) {
      // 如果存储失败(存储已满),清理过期缓存后重试
      if (e.name === 'QuotaExceededError') {
        this.clearExpired()
        try {
          localStorage.setItem(PREFIX + key, JSON.stringify(data))
          return true
        } catch (e) {
          console.error('Cache storage failed:', e)
          return false
        }
      }
      return false
    }
  },

  // 获取缓存
  get(key) {
    const data = localStorage.getItem(PREFIX + key)
    if (!data) return null

    try {
      const { value, expire, version } = JSON.parse(data)
      // 检查版本号和过期时间
      if (version !== CACHE_VERSION || (expire && Date.now() > expire)) {
        this.remove(key)
        return null
      }
      return value
    } catch {
      this.remove(key)
      return null
    }
  },

  // 移除缓存
  remove(key) {
    localStorage.removeItem(PREFIX + key)
  },

  // 清除所有缓存
  clear() {
    Object.keys(localStorage).forEach(key => {
      if (key.startsWith(PREFIX)) {
        localStorage.removeItem(key)
      }
    })
  },

  // 清除过期缓存
  clearExpired() {
    Object.keys(localStorage).forEach(key => {
      if (key.startsWith(PREFIX)) {
        try {
          const data = JSON.parse(localStorage.getItem(key))
          if (data.version !== CACHE_VERSION || (data.expire && Date.now() > data.expire)) {
            localStorage.removeItem(key)
          }
        } catch {
          localStorage.removeItem(key)
        }
      }
    })
  },

  // 获取缓存大小(字节)
  size() {
    let size = 0
    Object.keys(localStorage).forEach(key => {
      if (key.startsWith(PREFIX)) {
        size += localStorage.getItem(key).length * 2 // UTF-16 编码每个字符占2字节
      }
    })
    return size
  },

  // 检查缓存是否可用
  isAvailable() {
    try {
      const testKey = PREFIX + 'test'
      localStorage.setItem(testKey, 'test')
      localStorage.removeItem(testKey)
      return true
    } catch {
      return false
    }
  },

  // 获取所有缓存键
  keys() {
    return Object.keys(localStorage)
      .filter(key => key.startsWith(PREFIX))
      .map(key => key.slice(PREFIX.length))
  },

  // 批量设置缓存
  setMany(items, expire = CACHE_TIME.MEDIUM) {
    return items.every(({ key, value }) => this.set(key, value, expire))
  },

  // 批量获取缓存
  getMany(keys) {
    return keys.map(key => ({ key, value: this.get(key) }))
  },

  // 批量删除缓存
  removeMany(keys) {
    keys.forEach(key => this.remove(key))
  }
}

// 缓存键定义
export const CACHE_KEYS = {
  USER_INFO: 'user_info',
  DIAMOND_LIST: 'diamond_list',
  DIAMOND_DETAIL: 'diamond_detail_',
  FILTER_OPTIONS: 'filter_options',
  LANGUAGE: 'language',
  MENU_STATE: 'menu_state',
  THEME: 'theme',
  USER_PREFERENCES: 'user_preferences'
}

// 缓存时间定义
export const CACHE_EXPIRES = {
  USER_INFO: CACHE_TIME.WEEK,
  DIAMOND_LIST: CACHE_TIME.SHORT,
  DIAMOND_DETAIL: CACHE_TIME.MEDIUM,
  FILTER_OPTIONS: CACHE_TIME.LONG,
  LANGUAGE: CACHE_TIME.LONG,
  MENU_STATE: CACHE_TIME.LONG,
  THEME: CACHE_TIME.LONG,
  USER_PREFERENCES: CACHE_TIME.LONG
}

// 定期清理过期缓存(每小时)
if (typeof window !== 'undefined') {
  setInterval(() => {
    cache.clearExpired()
  }, 60 * 60 * 1000)
}

export default cache 

接口缓存

减少每次刷新或跳转进行数据请求,也可以进行二次封装减少代码量

import { cache, CACHE_KEYS, CACHE_EXPIRES } from '@/utils/cache'

// 获取钻石列表
export function getDiamondPage(params) {
  // 生成缓存键
  const cacheKey = CACHE_KEYS.DIAMOND_LIST + JSON.stringify(params)
  // 尝试从缓存获取
  const cachedData = cache.get(cacheKey)
  if (cachedData) {
    return Promise.resolve(cachedData)
  }
  // 发起请求
  return request({
    url: '/admin-api/bs/diamond/page',
    method: 'post',
    data: params
  }).then(res => {
    if (res.code === 0) {
      // 设置缓存
      cache.set(cacheKey, res, CACHE_EXPIRES.DIAMOND_LIST)
    }
    return res
  })
}

配置缓存

// 获取配置信息
const getCurrentLanguage = () => {
  const cachedLang = cache.get(CACHE_KEYS.LANGUAGE)
  if (cachedLang) return cachedLang
  
  const browserLang = navigator.language.toLowerCase()
  return browserLang.includes('zh') ? 'zh-CN' : 'en-US'
}
// 设置配置信息
cache.set(CACHE_KEYS.LANGUAGE, locale, CACHE_EXPIRES.LANGUAGE)

http://www.kler.cn/a/412200.html

相关文章:

  • python简单算法
  • burp功能介绍
  • 【一篇搞定配置】网络分析工具WireShark的安装与入门使用
  • 大数据面试SQL题-笔记02【查询、连接、聚合函数】
  • Linux下一次性关闭多个同名进程
  • Oracle SQL优化②——访问路径
  • python写共享内存,格式json
  • 实践篇:青果IP助理跨境电商的高效采集
  • JQuery -- 第九课
  • AWS IAM 及其功能
  • 『VUE』33. 组件保持存活,切换组件时的生命周期(详细图文注释)
  • 标记matlab曲线的x坐标
  • pyhton+yaml+pytest+allure框架封装-全局变量接口关联
  • C#调用C++ DLL方法之C++/CLI(托管C++)
  • web分页查询
  • Linux 生成/proc/config.gz
  • Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
  • 【redis】zset有序集合详解
  • 计算机网络习题解答--个人笔记(未完)
  • 新版:微信小程序跳转到任意小程序指定页面
  • 【联表查询中的隐蔽 bug】
  • 网易博客旧文-----安卓界面代码例子研究(一)
  • UE5材质Texture Sample 节点的基本概念
  • 数据结构 ——— 快速排序的时间复杂度以及规避最坏情况的方法
  • SlickGrid复选框
  • 前端-Git