Skip to content

缓存文档 - 缓存策略和性能优化

概述

本文档详细介绍了 VJSP Vue3 框架的缓存策略和性能优化机制。框架采用多层次的缓存架构,结合现代前端技术栈,为企业级应用提供高效的缓存解决方案和性能优化策略。

缓存架构

核心特性

  • 多级缓存策略:支持本地存储、会话存储、组件缓存等多级缓存机制
  • 安全存储:提供加密存储功能,保护敏感数据安全
  • 智能过期管理:自动清理过期缓存,优化存储空间
  • 组件缓存:基于 Vue keep-alive 的组件级缓存,提升页面切换性能
  • 性能监控:内置性能监控工具,实时跟踪应用性能指标

技术栈

  • Web Storage API:localStorage 和 sessionStorage 基础存储
  • CryptoJS:数据加密解密,提高存储安全性
  • Pinia 状态管理:缓存状态和性能状态管理
  • Vue keep-alive:组件级缓存机制
  • ECharts:性能监控数据可视化

缓存管理机制

缓存工具类 (CacheUtil)

框架提供统一的缓存操作接口,支持多种存储模式和配置选项。

缓存选项配置

缓存工具支持丰富的配置选项:

  • 过期时间:设置缓存数据的有效期限
  • 存储模式:选择 localStorage 或 sessionStorage
  • 加密存储:启用数据加密保护敏感信息
  • 自定义密钥:支持自定义加密密钥

核心功能方法

缓存工具类提供完整的 CRUD 操作:

  • 设置缓存:支持多种存储模式和加密选项
  • 获取缓存:自动检查过期并返回有效数据
  • 缓存管理:支持删除、清空、检查等操作
  • 性能优化:提供缓存大小计算和过期清理功能

安全存储工具 (SecurityStorage)

专门用于敏感数据的安全存储,提供额外的安全保护机制。

安全特性

  • 动态密钥生成:结合浏览器指纹生成唯一加密密钥
  • 会话级存储:默认使用 sessionStorage 提高安全性
  • Token 管理:专门的安全 Token 存储方法
  • 用户信息保护:加密存储用户敏感信息

应用场景

  • 用户登录 Token 的安全存储
  • 敏感用户信息的加密保护
  • 记住我功能的实现
  • 安全会话管理

组件缓存机制

keep-alive 组件缓存

框架基于 Vue keep-alive 实现组件级缓存,提升页面切换性能。

缓存策略

  • 动态缓存管理:根据路由配置动态管理缓存组件
  • 智能缓存清理:自动清理不需要的缓存组件
  • 缓存视图管理:通过 tagsView 状态管理缓存视图

配置方式

在路由配置中通过 meta 属性控制组件缓存:

typescript
// 路由配置示例
{
  path: '/product/list',
  name: 'ProductList',
  component: () => import('@/views/product/List.vue'),
  meta: {
    title: '产品列表',
    noCache: false // 启用缓存(默认)
  }
}

标签页缓存管理

通过 tagsView 状态管理实现标签页级别的缓存控制。

缓存视图管理

  • 缓存视图集合:维护当前需要缓存的组件名称集合
  • 动态缓存更新:根据标签页操作动态更新缓存策略
  • 缓存状态同步:确保缓存状态与用户操作同步

性能优化策略

1. 路由懒加载

采用动态导入实现路由组件的按需加载:

  • 代码分割:自动分割代码块,减少初始包大小
  • 按需加载:用户访问时动态加载对应组件
  • 预加载优化:智能预加载可能访问的组件

2. 组件优化

计算属性缓存

合理使用计算属性,利用 Vue 的响应式缓存机制:

  • 依赖追踪:自动追踪依赖关系,避免重复计算
  • 缓存复用:相同依赖下复用计算结果
  • 性能监控:监控计算属性的性能表现

防抖节流优化

对高频操作进行防抖节流处理:

  • 搜索优化:搜索输入框的防抖处理
  • 滚动优化:滚动事件的节流控制
  • 表单优化:表单提交的防重复提交

3. 数据缓存策略

字典数据缓存

对常用字典数据进行缓存优化:

  • 预加载缓存:应用启动时预加载常用字典
  • 缓存更新:定时更新缓存数据,保持数据新鲜度
  • 内存优化:合理控制缓存大小,避免内存泄漏

API 响应缓存

对频繁请求的 API 响应进行缓存:

  • 请求去重:相同请求避免重复发送
  • 缓存时效:设置合理的缓存过期时间
  • 缓存失效:数据变更时主动清除相关缓存

Product 模块开发指南

1. 产品数据缓存实现

在 Product 模块开发中,合理使用缓存策略提升性能。

产品列表缓存

typescript
// src/views/product/List.vue
import { CacheUtil } from '@/utils/cache'

// 产品列表数据缓存
const PRODUCT_LIST_CACHE_KEY = 'product_list_cache'
const PRODUCT_LIST_CACHE_EXPIRE = 5 * 60 * 1000 // 5分钟缓存

// 获取产品列表(带缓存)
const getProductList = async () => {
  // 先检查缓存
  const cachedData = CacheUtil.getLocal(PRODUCT_LIST_CACHE_KEY)
  if (cachedData) {
    return cachedData
  }

  // 缓存未命中,请求接口
  const response = await getProductListApi()

  // 设置缓存
  CacheUtil.setLocal(PRODUCT_LIST_CACHE_KEY, response.data, PRODUCT_LIST_CACHE_EXPIRE)

  return response.data
}

产品详情缓存

typescript
// src/views/product/Detail.vue
// 产品详情缓存(基于产品ID)
const getProductDetail = async (productId: string) => {
  const cacheKey = `product_detail_${productId}`
  const cacheExpire = 10 * 60 * 1000 // 10分钟缓存

  // 检查缓存
  const cachedDetail = CacheUtil.getLocal(cacheKey)
  if (cachedDetail) {
    return cachedDetail
  }

  // 请求接口
  const response = await getProductDetailApi(productId)

  // 设置缓存
  CacheUtil.setLocal(cacheKey, response.data, cacheExpire)

  return response.data
}

2. 组件缓存配置

为 Product 模块配置合理的组件缓存策略。

产品列表页面缓存

typescript
// src/router/modules/product.ts
{
  path: '/product/list',
  name: 'ProductList',
  component: () => import('@/views/product/List.vue'),
  meta: {
    title: '产品列表',
    noCache: false, // 启用缓存
    keepAliveName: 'ProductList' // 缓存组件名称
  }
}

产品详情页面缓存

typescript
// 产品详情页面(通常不需要缓存,保持数据实时性)
{
  path: '/product/detail/:id',
  name: 'ProductDetail',
  component: () => import('@/views/product/Detail.vue'),
  meta: {
    title: '产品详情',
    noCache: true // 禁用缓存
  }
}

3. 性能优化实践

图片懒加载

vue
<!-- src/views/product/List.vue -->
<template>
  <div class="product-list">
    <div v-for="product in products" :key="product.id" class="product-item">
      <el-image :src="product.image" :alt="product.name" lazy :scroll-container="scrollContainer" />
      <div class="product-info">
        <h3>{{ product.name }}</h3>
        <p>{{ product.description }}</p>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const scrollContainer = ref<HTMLElement | null>(null)
</script>

虚拟滚动优化

对于大量产品数据的列表展示,使用虚拟滚动优化性能:

vue
<!-- src/views/product/List.vue -->
<template>
  <el-table-v2 :columns="columns" :data="products" :width="800" :height="400" fixed />
</template>

<script setup lang="ts">
import { ref } from 'vue'

const columns = [
  {
    key: 'name',
    title: '产品名称',
    width: 200,
  },
  {
    key: 'price',
    title: '价格',
    width: 100,
  },
  // ... 更多列定义
]

const products = ref([])
</script>

缓存监控和调试

1. 缓存状态监控

框架提供缓存状态监控工具,帮助开发者了解缓存使用情况。

缓存统计信息

typescript
// 获取缓存统计信息
const getCacheStats = () => {
  const localKeys = CacheUtil.keys(false)
  const sessionKeys = CacheUtil.keys(true)

  return {
    localCache: {
      count: localKeys.length,
      size: CacheUtil.size(false),
      keys: localKeys,
    },
    sessionCache: {
      count: sessionKeys.length,
      size: CacheUtil.size(true),
      keys: sessionKeys,
    },
  }
}

缓存清理工具

typescript
// 定期清理过期缓存
const scheduleCacheCleanup = () => {
  // 每小时清理一次过期缓存
  setInterval(
    () => {
      CacheUtil.cleanupExpired(false) // 清理本地缓存
      CacheUtil.cleanupExpired(true) // 清理会话缓存
    },
    60 * 60 * 1000
  )
}

2. 性能监控工具

框架内置性能监控功能,帮助识别性能瓶颈。

性能指标监控

typescript
// 性能监控配置
const performanceMonitor = {
  // 监控FPS(帧率)
  monitorFPS: () => {
    let lastTime = performance.now()
    let frames = 0

    const loop = () => {
      frames++
      const currentTime = performance.now()
      if (currentTime - lastTime >= 1000) {
        const fps = Math.round((frames * 1000) / (currentTime - lastTime))
        console.log(`当前FPS: ${fps}`)
        frames = 0
        lastTime = currentTime
      }
      requestAnimationFrame(loop)
    }
    loop()
  },

  // 监控内存使用
  monitorMemory: () => {
    if ('memory' in performance) {
      const memory = (performance as any).memory
      console.log(`内存使用: ${Math.round(memory.usedJSHeapSize / 1024 / 1024)}MB`)
    }
  },
}

最佳实践

1. 缓存策略选择

根据数据特性选择缓存策略

  • 静态数据:长期缓存(如字典数据、配置信息)
  • 半静态数据:中等时长缓存(如产品分类、用户信息)
  • 动态数据:短期缓存或实时获取(如产品库存、订单状态)

缓存层级设计

  • 内存缓存:当前会话的临时数据
  • 会话缓存:用户会话期间有效的数据
  • 本地缓存:长期有效的配置数据

2. 性能优化技巧

代码分割优化

typescript
// 动态导入优化
const ProductEditor = defineAsyncComponent({
  loader: () => import('@/views/product/Editor.vue'),
  loadingComponent: LoadingComponent,
  delay: 200, // 延迟显示加载组件
  timeout: 3000, // 超时时间
})

图片优化策略

  • 格式选择:根据场景选择 WebP、JPEG、PNG 等格式
  • 尺寸优化:根据显示尺寸提供合适大小的图片
  • 懒加载:非首屏图片延迟加载
  • CDN 加速:使用 CDN 加速图片加载

3. 错误处理和降级

缓存失败处理

typescript
// 缓存获取的容错处理
const getCachedDataWithFallback = async (key: string, fallback: () => Promise<any>) => {
  try {
    const cached = CacheUtil.getLocal(key)
    if (cached) return cached

    const data = await fallback()
    CacheUtil.setLocal(key, data)
    return data
  } catch (error) {
    console.error('缓存处理失败:', error)
    // 降级到直接调用fallback
    return fallback()
  }
}

性能监控告警

typescript
// 性能阈值监控
const performanceThresholds = {
  fps: 30, // 最低FPS阈值
  memory: 100, // 最大内存使用(MB)
  loadTime: 3000, // 最大加载时间(ms)
}

// 监控性能并触发告警
const checkPerformance = () => {
  const currentFPS = getCurrentFPS()
  if (currentFPS < performanceThresholds.fps) {
    console.warn('FPS过低,可能存在性能问题')
  }
}

总结

VJSP Vue3 框架提供了完整的缓存策略和性能优化解决方案。通过多级缓存架构、安全存储机制、组件缓存优化和性能监控工具,帮助开发者构建高性能的企业级应用。

在 Product(演示) 模块开发中,合理运用缓存策略可以显著提升用户体验和系统性能。建议根据具体业务场景选择合适的缓存策略,并持续监控和优化应用性能。