后台用redis缓存一些数据,有些数据需要给它一个时效性,比如token,用着挺方便的,写小程序的时候也想有个这种能设置过期时间的东西,可是官方没有直接提供这方面的接口,于是就总(抄)结(袭)其他大牛的一些技巧,简单的封装了一个工具类

好了,废话不多说了,先普及一下小程序的缓存基础知识吧

将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。数据存储生命周期跟小程序本身一致,即除用户主动删除或超过一定时间被自动清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。

划重点呀

相同的key会覆盖;

用户可以主动删除缓存;

缓存数据有10MB!

localStorage 以用户维度隔离,说到隔离,我就想起之前有几个同学说A用户的数据被B用户拿到了,当时我有点惊讶,小程序的数据缓存是不会窜用户的吧,后来大半夜的帮那位同学找bug,原来是后台的一个判断错了,还有一个是在真机调试的时候发生,最后原因是因为这里,勾选了使用工具端的Storage,勾了这个选项,缓存就共享了

微信小程序的sessionkey时效_wx.setStorage

 

又说了一些题外话,咳咳,继续继续

localStorage 以用户维度隔离

同一台设备上,同一个小程序,A 用户无法读取到 B 用户的数据。

其实这点我刚开始接触小程序缓存的时候也分不清,因为怕数据混乱,然后每次进小程序的时候都先清除全部缓存,现在感觉当时好2啊

缓存的一些详细的用法我这里就不讲了哈,我主要还是讲讲设置缓存的有效期,详细还请各位同学去小程序官网翻API

https://developers.weixin.qq.com/miniprogram/dev/api/wx.setStorage.html

思路其实就是,封装一个方法,方法的参数就是 键key,值value,时间time,里面存两个缓存,一个存你要存的数据,一个用来存时间,这个时间怎么存呢,自定义一个标识(我用的是“redis”)+key值

取值的也是一样的,封装一个方法,参数只需要key就行了,先用自定义的标识+key取出时间,然后比较现在的时间,如果大于现在的时间,说明还没过期,然后返回key对应的value,如果小于现在的时间,说明过期了,删除key对应的数据,返回null

下面贴个代码,同学们即可C+V使用

 

 redis.js

var redis= "redis"

/**
 * 设置
 * k 键key
 * v 值value
 * t 秒
 */
function put(k, v, t) {
  wx.setStorageSync(k, v)
  var seconds = parseInt(t)
  if (seconds > 0) {
    var newtime = Date.parse(new Date())
    newtime = newtime / 1000 + seconds;
    wx.setStorageSync(k + redis, newtime + "")
  } else {
    wx.removeStorageSync(k + redis)
  }
}
/**
 * 获取
 * k 键key
 */
function get(k) {
  var deadtime = parseInt(wx.getStorageSync(k + redis))
  if (deadtime) {
    if (parseInt(deadtime) < Date.parse(new Date()) / 1000) {
      wx.removeStorageSync(k);
      console.log("过期了")
      return null
    }
  }
  var res=wx.getStorageSync(k)
  if(res){
    return res
  }else{
    return null
  }
}

/**
 * 删除
 */
function remove(k) {
  wx.removeStorageSync(k);
  wx.removeStorageSync(k + redis);
}

/**
 * 清除所有key
 */
function clear() {
  wx.clearStorageSync();
}
module.exports={
  put,
  get,
  remove,
  clear
}

这样一个简单的小程序设置缓存过期时间就完成了,不足之处还请多谢指正