vue3-时间戳防缓存

加时间戳防止缓存的原理:

1. 缓存机制的工作原理

浏览器和代理服务器会根据完整的URL作为缓存的键(key)。当URL完全相同时,它们可能不会发起新请求,而是直接返回缓存的结果。

2. 时间戳如何打破缓存

复制代码
// 第一次请求
URL: /v1/orders?timestamp=1638321234567

// 第二次请求(即使其他参数相同)
URL: /v1/orders?timestamp=1638321239999  // 时间戳不同!

// 缓存系统看到两个不同的URL,会认为这是两个不同的请求

3. 实际应用场景

复制代码
// 有缓存的可能问题
fetch('/api/data')  // 多次请求相同URL可能返回缓存

// 加时间戳防止缓存
fetch(`/api/data?t=${Date.now()}`) // 每次都不同,强制重新请求

4. 为什么POST请求也需要防缓存

虽然POST请求理论上不应该被缓存,但:

  • 某些浏览器或代理可能有异常实现
  • 一些中间件(如CDN、API网关)可能配置不当
  • 防止历史请求被误用
  • 确保调试时能获取最新数据

5. 其他防缓存的方法

复制代码
const orderConfig = {
  params: {
    // 方法1:时间戳(最常用)
    _t: Date.now(),
    
    // 方法2:随机数
    _r: Math.random(),
    
    // 方法3:版本号(用于强制更新)
    _v: '1.0.0',
    
    // 方法4:使用请求ID
    requestId: uuidv4()
  },
  
  headers: {
    // 方法5:设置请求头禁止缓存
    'Cache-Control': 'no-cache, no-store, must-revalidate',
    'Pragma': 'no-cache',
    'Expires': '0'
  }
}

6. 注意事项

复制代码
// 1. 注意参数命名,避免与业务参数冲突
params: {
  timestamp: Date.now(),  // 通常加下划线或特殊前缀
  _: Date.now(),         // 更简洁的写法
  nocache: Date.now()    // 语义明确的写法
}

// 2. 对于GET请求尤其重要
const getMenuConfig = {
  method: 'get',
  params: {
    restaurantId: 'res_456',
    _: Date.now()  // GET请求必须加时间戳!
  }
}

// 3. 在axios中可以全局配置
axios.interceptors.request.use(config => {
  if (config.method === 'get') {
    config.params = {
      ...config.params,
      _t: Date.now()
    }
  }
  return config;
});

总结: 时间戳通过让每次请求的URL都不同,强制缓存系统将其视为新请求,从而绕过缓存机制,确保获取最新数据。这在需要实时数据的场景(如外卖、支付、聊天)中非常重要。

相关推荐
三8445 小时前
SSRF 从入门到实战(下篇):gopher 打 Redis 实现 RCE
数据库·redis·缓存
名字还没想好☜5 小时前
Java 用 LinkedHashMap 三行实现 LRU 缓存:accessOrder、removeEldestEntry 与线程安全
java·后端·安全·spring·缓存
手握风云-5 小时前
Redis:不只是缓存那么简单(十六)
缓存
驾驭人生1 天前
Hangfire.Redis.StackExchange 已归档停更!生产任务卡死、重复执行、网络抖动问题解决方案
数据库·redis·缓存
TDengine (老段)1 天前
TDengine Catalog 与元数据缓存
大数据·数据库·物联网·缓存·时序数据库·tdengine
hui-梦苑1 天前
[Gromacs]核心性能梯度测试:GROMACS 多线程性能调优实验
缓存·性能优化·多线程·gromacs·动力学模拟
Lyyaoo.1 天前
【链表】【中等】两数相加/倒N删除/两个交换/排序链表/LRU缓存
数据结构·链表·缓存
努力努力再努力wz1 天前
【Redis入门系列】:从 RESP 协议到 redis-plus-plus:Redis 客户端编程与 C++ 接口设计
开发语言·数据库·c++·redis·分布式·缓存·架构
OH_TPC2 天前
【鸿蒙优选三方库】@react-native-ohos/react-native-fast-image:高性能图片加载与缓存组件
缓存·华为·harmonyos·鸿蒙