微信小程序实现缓存过期时间

微信小程序实现缓存过期时间


前言

先来看看官方文档


 wx.setStorageSync(string key, any data)
将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。	
注意:需要存储的内容。只支持原生类型、Date、及能够通过JSON.stringify序列化的对象。
	

很遗憾没有过期时间设置, 如果有数据更新, 则需要重新清除本地缓存


我们可以自己写缓存过期逻辑。 思路:在保存对象时, 同时保存一个对象,用于判断过期时间

一、设置缓存

 this.SetCache = function (key, data, milliseconds) {
      if (milliseconds && milliseconds > 0) {
        var curTime = new Date();
        let cacheDateList = []; //时间缓存对象数组,便于后面Get时批量处理过期缓存
        cacheDateList = wx.getStorageSync('cacheDataList');
        if (!cacheDateList || cacheDateList.length == 0) {
          cacheDateList = [];
        }
        let existkey = false;
        cacheDateList.forEach(a => {
          //如果存在则重新更新过期时间
          if (a.key == key) {
            a.invalidtime = curTime.getTime() + milliseconds;
            existkey = true;
          }
        })
        //如果不存在, 则新添加
        if (!existkey) {
          cacheDateList.push({ key: key, invalidtime: curTime.getTime() + milliseconds, interval: milliseconds })
        }
        //设置缓存对象数组
        wx.setStorageSync('cacheDataList', cacheDateList);
      }
      wx.setStorageSync(key, data);
    };

二、得到缓存

 	//获取缓存数据 isSliding 是否滑动缓存请求
    this.GetCache = function (key, isSliding) {
      let cacheDateList = [];
      let curTime = new Date();
      let clist = [];
      cacheDateList = wx.getStorageSync('cacheDataList');
      if (cacheDateList && cacheDateList.length > 0) {
        cacheDateList.forEach(a => {
          //剔除已过期的缓存
          if (a.invalidtime < curTime.getTime()) {          
            wx.removeStorageSync(a.key);
          }
          else {
            if (a.key == key) {
              if (isSliding) {
                a.invalidtime = curTime.getTime() + a.interval;
              }
            }
            clist.push(a);
          }
        });
        wx.setStorageSync('cacheDataList', clist);
      }

      return wx.getStorageSync(key);
    }

总结

通过自定义一个缓存对象,来达到过期时间的设置, 如何清除 wx.setStorageSync(‘cacheDataList’, clist); 对象,或则服务器更新新重置, 可以再从服务器取一个系统版本号写入本地, 当版本号与本地对比不一致时,则直接可清除所有缓存。

<think>嗯,用户现在问的是微信小程序中图片加载缓存过期时间设置方法。首先,我需要确认用户的需求是什么。用户可能在实际开发中遇到了图片缓存无法自动过期的问题,需要一种解决方案来管理缓存,避免占用过多空间或显示过期的图片。回顾之前的对话历史,用户提到站内引用里介绍了小程序默认缓存是永久的,但开发者有时需要设置时效性。用户现在关心的是图片加载的缓存,尤其是过期时间设置方法。这可能涉及微信的API限制,因为微信本身没有提供直接设置缓存过期时间的接口。接下来,我需要分析微信小程序缓存机制。小程序中图片加载通常有两种方式:使用image组件直接引用网络图片,或者通过文件系统API手动缓存。第一种情况,微信的缓存机制由客户端控制,开发者无法干预过期时间。第二种情况,开发者需要自己实现缓存逻辑,包括过期策略。用户可能需要一个具体的解决方案,所以得考虑如何设计一个带过期时间缓存系统。比如使用Storage和文件系统的组合:将图片下载到临时路径,同时记录过期时间。每次加载时检查是否过期过期则重新下载。这个方案的核心在于如何存储和管理缓存元数据。另外,用户可能希望知道如何优化这个流程,比如使用异步操作避免阻塞UI,或者定期清理过期缓存以减少空间占用。还要考虑实际实现中的注意事项,比如缓存Key的设计、发下载的处理,以及如何防止存储空间超限。需要确保提供的解决方案详细且可行,包括代码示例和关键步骤。同时要提醒用户注意Storage的大小限制(10MB)和文件系统限制,可能需要分文件类型或设置不同过期策略来优化管理。最后,用户可能需要相关问题的引导,比如优化缓存策略或处理过期缓存的方法,这有助于他们进一步解决问题。但当前主要问题还是缓存过期时间实现,应优先给出清晰的方法。</think> 微信小程序本身没有提供直接设置**图片加载缓存过期时间**的功能,因为微信的Image组件自动缓存的图片不由开发者控制且无过期机制。但可以通过以下方案**间接实现图片缓存过期管理**: --- ### **核心解决方案:手动缓存管理 + Storage记录过期时间** 1. **下载图片到本地临时文件** ```javascript wx.downloadFile({ url: 'https://example.com/image.jpg', success: res => { const tempFilePath = res.tempFilePath // 下载的临时路径 this.saveImageWithExpiry(tempFilePath, 'myImageKey', 24) // 保存设置24小时过期 } }) ``` 2. **封装带过期时间缓存函数** ```javascript // 保存图片路径及过期时间戳 saveImageWithExpiry(filePath, key, expireHours) { const expireTime = Date.now() + expireHours * 3600000 wx.setStorageSync(key, { path: filePath, expire: expireTime }) } // 检查图片是否过期 getImageWithExpiry(key) { const cache = wx.getStorageSync(key) if (!cache) return null if (Date.now() > cache.expire) { wx.removeStorageSync(key) // 清除过期记录 return null } return cache.path // 返回有效图片路径 } ``` 3. **图片加载时优先使用缓存** ```javascript Page({ loadImage() { const cachedPath = this.getImageWithExpiry('myImageKey') if (cachedPath) { this.setData({ imageSrc: cachedPath }) // 使用缓存 } else { wx.downloadFile({...}) // 重新下载 } } }) ``` 4. **清理过期缓存(可选定时任务)** ```javascript const keys = wx.getStorageInfoSync().keys keys.forEach(key => { const data = wx.getStorageSync(key) if (data?.expire && data.expire < Date.now()) { wx.removeStorageSync(key) } }) ``` --- ### **关键说明** 1. **微信原生限制**:微信Image组件的缓存是永久性的,此方案通过开发者主动管理缓存文件规避限制[^1] 2. **缓存位置**:`wx.downloadFile`下载的文件默认位于**临时目录**(小程序的代码包目录不可写) 3. **存储类型**:使用`Storage`仅存储图片**路径和过期时间**(非图片二进制数据) 4. **空间管理**:需监控缓存总量(`Storage`上限10MB,临时文件不计入但需手动清理[^2]) --- ### **为什么需要手动管理?** - 微信未开放图片缓存生命周期控制API - 永久缓存可能导致存储空间膨胀(尤其频繁更新的图片) - 业务需求如:促销图片需在活动后失效、用户头像更新后需刷新 --- ### **相关问题延伸** 1. 如何监控小程序缓存总量避免超限? 2. 除了定期清理,还有哪些优化缓存性能的策略? 3. 如何实现全局缓存管理工具类? 4. 小程序临时文件和本地文件的区别及适用场景? > 此方案通过**主动存储过期元数据**实现了逻辑过期控制,实际开发中可封装为通用工具函数复用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值