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)
相关推荐
OEC小胖胖14 分钟前
Vue 3 中 onUnload 和 onPageScroll 使用详解
前端·javascript·vue.js·前端框架·web
秋田君1 小时前
uniapp中使用Mescroll实现下拉刷新与上拉加载项目实战
javascript·uni-app
HilariousDog2 小时前
Redis1——基本命令及原理
数据库·redis·缓存
川石教育2 小时前
Vue前端开发-slot传参
前端·vue.js·前端框架·前端开发·slot组件
确实菜,真的爱2 小时前
vue3 element plus 把表格数据导出到excel
javascript·vue.js·excel
一舍予2 小时前
nuxt3项目搭建相关
开发语言·javascript·vue.js·nuxt
m0_513519572 小时前
lc 146. LRU 缓存
缓存
LXMXHJ2 小时前
项目缓存之Caffeine咖啡因
缓存·caffeine
新时代的弩力2 小时前
【Cesium】--viewer,entity,dataSource
前端·javascript·vue.js