# 数据缓存
# setStorageSync
基础库 1.3.9 起支持,SDK 2.1.38 起支持
setStorageSync(string key, any data)
ft.setStorage 的同步版本。将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
参数
string key
本地缓存中指定的 key
any data
需要存储的内容。只支持原生类型、Date、及能够通过 JSON.stringify 序列化的对象。
示例代码
ft.setStorage({
key: 'key',
data: 'value'
})
try {
ft.setStorageSync('key', 'value')
} catch (e) { }
# setStorage
基础库 1.3.9 起支持,SDK 2.1.38 起支持
setStorage(Object object)
将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
key | string | 是 | 本地缓存中指定的 key | |
data | any | 是 | 需要存储的内容。只支持原生类型、Date、及能够通过 JSON.stringify 序列化的对象。 | |
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码
ft.setStorage({
key: 'key',
data: 'value'
})
try {
ft.setStorageSync('key', 'value')
} catch (e) { }
# removeStorageSync
基础库 1.3.9 起支持,SDK 2.1.38 起支持
removeStorageSync(string key)
ft.removeStorage 的同步版本
参数
string key
本地缓存中指定的 key
示例代码
ft.removeStorage({
key: 'key',
success(res) {
console.log(res)
}
})
try {
ft.removeStorageSync('key')
} catch (e) {
// Do something when catch error
}
# removeStorage
基础库 1.3.9 起支持,SDK 2.1.38 起支持
removeStorage(Object object)
从本地缓存中异步移除指定 key 对应的内容
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
key | string | 是 | 本地缓存中指定的 key | |
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码
ft.removeStorage({
key: 'key',
success(res) {
console.log(res)
}
})
try {
ft.removeStorageSync('key')
} catch (e) {
// Do something when catch error
}
# getStorageSync
基础库 1.3.9 起支持,SDK 2.1.38 起支持
getStorageSync(string key)
ft.getStorage 的同步版本
参数
string key
本地缓存中指定的 key
返回值
any
key 对应的本地存储内容
示例代码
ft.getStorage({
key: 'key',
success(res) {
console.log(res.data)
}
})
try {
const value = ft.getStorageSync('key')
if (value) {
// Do something with return value
}
} catch (e) {
// Do something when catch error
}
# getStorageInfoSync
基础库 1.3.9 起支持,SDK 2.1.38 起支持
getStorageInfoSync(Object object)
ft.getStorageInfo 的同步版本
返回值
Object object
属性 | 类型 | 说明 |
---|---|---|
keys | Array.<string> | 当前 storage 中所有的 key |
currentSize | number | 当前占用的空间大小, 单位 KB |
limitSize | number | 限制的空间大小,单位 KB |
示例代码
ft.getStorageInfoSync({
success(res) {
console.log(res.keys)
console.log(res.currentSize)
console.log(res.limitSize)
}
})
try {
const res = ft.getStorageInfoSync()
console.log(res.keys)
console.log(res.currentSize)
console.log(res.limitSize)
} catch (e) {
// Do something when catch error
}
# getStorageInfo
基础库 1.3.9 起支持,SDK 2.1.38 起支持
getStorageInfo(Object object)
获取当前storage的相关信息。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
object.success 回调函数
参数
Object res
属性 | 类型 | 说明 |
---|---|---|
keys | Array.<string> | 当前 storage 中所有的 key |
currentSize | number | 当前占用的空间大小, 单位 KB |
limitSize | number | 限制的空间大小,单位 KB |
示例代码
ft.getStorageInfo({
success(res) {
console.log(res.keys)
console.log(res.currentSize)
console.log(res.limitSize)
}
})
try {
const res = ft.getStorageInfoSync()
console.log(res.keys)
console.log(res.currentSize)
console.log(res.limitSize)
} catch (e) {
// Do something when catch error
}
# getStorage
基础库 1.3.9 起支持,SDK 2.1.38 起支持
getStorage(Object object)
从本地缓存中获取指定key对应的内容。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
key | string | 是 | 本地缓存中指定的 key | |
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
object.success 回调函数
参数
Object res
属性 | 类型 | 说明 |
---|---|---|
data | any | key对应的内容 |
示例代码
ft.getStorage({
key: 'key',
success(res) {
console.log(res.data)
}
})
try {
const value = ft.getStorageSync('key')
if (value) {
// Do something with return value
}
} catch (e) {
// Do something when catch error
}
# clearStorageSync
基础库 1.3.9 起支持,SDK 2.1.38 起支持
clearStorageSync(Object object)
ft.clearStorage 的同步版本
示例代码
ft.clearStorage()
try {
ft.clearStorageSync()
} catch (e) {
// Do something when catch error
}
# clearStorage
基础库 1.3.9 起支持,SDK 2.1.38 起支持
clearStorage(Object object)
清理本地数据缓存
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码
ft.clearStorage()
try {
ft.clearStorageSync()
} catch (e) {
// Do something when catch error
}
# batchSetStorageSync
基础库 3.0.49 起支持
batchSetStorageSync(Array kvList)
ft.batchSetStorage 的同步版本,将数据批量存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
kvList | Array | 是 | key value 数组: [{ key, value }] |
示例代码
try {
ft.batchSetStorageSync([{key: 'key', value: 'value'}])
} catch (e) { }
# batchSetStorage
基础库 3.0.49 起支持
batchSetStorage(Object object)
将数据批量存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
kvList | Array | 是 | key value 数组: [{ key, value }] | |
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码
wx.batchSetStorage({
kvList: [{
key: 'key',
value: 'value',
}],
})
# batchGetStorageSync
基础库 3.0.49 起支持
batchGetStorageSync(Array keyList)
ft.batchGetStorage 的同步版本
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
keyList | Array | 是 | key value 数组: [{ key, value }] |
示例代码
try {
var valueList = ft.batchGetStorageSync(['key'])
} catch (e) {
}
# batchGetStorage
基础库 3.0.49 起支持
batchGetStorage(Object object)
从本地缓存中异步批量获取指定 key 的内容。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
kvList | Array | 是 | key value 数组: [{ key, value }] | |
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码
ft.batchGetStorage({
keyList: ['key'],
success (res) {
console.log(res)
}
})
# 数据预拉取和周期性更新
# setBackgroundFetchToken
基础库 3.2.1 起支持,SDK 2.43.1 起支持
setBackgroundFetchToken(Object object)
设置自定义登录 token,token 会在周期性拉取数据时带上,用于开发者的第三方服务器验证请求的合法性。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
token | string | 是 | 请求 token | |
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
示例代码
ft.setBackgroundFetchToken({
token: 'some token'
})
# getBackgroundFetchToken
基础库 3.2.1 起支持,SDK 2.43.1 起支持
getBackgroundFetchToken(Object object)
获取设置过的自定义登录态。若无,则返回 fail。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
参数
Object object
属性 | 类型 | 说明 |
---|---|---|
token | string | 自定义的请求 token |
errMsg | string | 接口调用结果 |
示例代码
ft.getBackgroundFetchToken({
success(res) {
console.log(res.token)
}
})
# getBackgroundFetchData
基础库 3.2.1 起支持,SDK 2.43.1 起支持
getBackgroundFetchData(Object object)
拉取客户端缓存的周期性更新和数据预拉取数据。
当调用接口时,若当次请求未结束,会先返回本地的旧数据(之前打开小程序时请求的)。
如果本地没有旧数据,两端不会等待请求完成。安卓上会返回 fail;iOS上会返回 success 但 fetchedData 为空。
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
fetchType | string | 是 | 缓存数据类别,取值为 periodic 或 pre | |
success | function | 否 | 接口调用成功的回调函数 | |
fail | function | 否 | 接口调用失败的回调函数 | |
complete | function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
object.success 回调函数
参数
Object object
属性 | 类型 | 说明 |
---|---|---|
fetchedData | string | 缓存数据 |
timeStamp | number | 客户端拿到缓存数据的时间戳,单位 ms |
path | string | 小程序页面路径 |
query | string | 传给页面的 query 参数 |
scene | number | 进入小程序的场景值 |
示例代码
ft.getBackgroundFetchToken({
success(res) {
console.log(res.token)
}
})
# onBackgroundFetchData
基础库 3.2.1 起支持,SDK 2.43.1 起支持
onBackgroundFetchData(function callback)
监听收到周期性更新和数据预拉取的事件,如果监听时请求已经完成,则事件不会触发,建议和 ft.getBackgroundFetchData 配合使用。
参数
function callback
收到周期性更新和数据预拉取数据事件的监听函数
参数
Object res
属性 | 类型 | 说明 |
---|---|---|
fetchType | string | 缓存数据的类别,取值为 periodic 或 pre |
fetchedData | string | 缓存数据 |
timeStamp | number | 客户端拿到缓存数据的时间戳,单位 ms |
path | string | 小程序页面路径 |
query | string | 传给页面的 query 参数 |
scene | number | 进入小程序的场景值 |
示例代码
ft.onBackgroundFetchData(function (res) {
console.log(res.fetchType)
console.log(res.fetchedData)
console.log(res.timeStamp)
console.log(res.path)
console.log(res.query)
console.log(res.scene)
})
# 缓存管理器
# ft.createCacheManager
创建缓存管理器
参数
Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
origin | string | 否 | 全局 origin | |
mode | string | weakNetwork | 否 | 缓存模式 可选值:weakNetwork,always,none |
maxAge | number | 否 | 全局缓存有效时间,单位为毫秒,默认为 7 天,最长不超过 30 天 | |
extra | object | 否 | 额外的缓存处理 |
extra
结构属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
apiList | Array | 否 | 需要缓存的 wx api 接口,不传则表示支持缓存的接口全都做缓存处理。返回的如果是缓存数据,开发者可通过 fromCache 标记区分. 可选值:wx.login,wx.checkSession ,wx.getSetting |
返回值
CacheManager
缓存管理器
示例代码
const cacheManager = ft.createCacheManager()
cacheManager.addRule(/https:\/\/(?:.*)/ig) // 表示所有 https 请求都匹配
cacheManager.on('request', evt => {
// 在弱网时接收到 wx.request 请求
return new Promise((resolve, reject) => {
const matchRes = cacheManager.match(evt)
if (matchRes && matchRes.data) {
// 有缓存,返回
resolve(matchRes.data)
} else {
// 没缓存,抛错
reject({ errMsg: 'no cache' })
}
})
})
# CacheManager
缓存管理器。全局只有唯一实例,一旦被创建出来即表示接入缓存管理器。其有以下几个能力:
在网络通畅时,符合一定规则的用户网络请求(目前只包括普通 wx.request 请求)会被缓存。 在网络通畅时,某些 wx api 调用会被缓存。 进入弱网/离线状态时,会提供事件给用户,用户可以决定是否使用缓存返回。 提供进入和退出弱网/离线状态的事件。
# CacheManager.addRule
添加规则。
参数 Object rule
规则
返回值
string
规则 id
规则说明
支持的规则写法有字符串、正则和对象三种:
字符串写法
- addRule('/abc'):纯 uri 串。
- `addRule('GET /abc'):带方法的 uri 串,除了匹配 uri 外,还会匹配请求方法。如例子中必须是 GET 方法请求才会被匹配。
- addRule('/abc/:id'):带可变部分的 uri 串,id 可以是任意符合标准的字符串,表示这一段可以动态变化。比如/abc/123和/abc/321都会被匹配,而/abc/123/xxx` 因为多了一段,就不会被匹配。
- addRule('/abc?aa'):带 query 参数的 uri 串,包含 aa 参数,值可以为任意值。比如/abc?aa=haha会被匹配,但是/abc就不会被匹配,因为缺少规则中声明的 aa 参数;不过如果请求是/abc?aa=haha&bb=123`,虽然多带了 bb 参数,但是因为包含了 aa 参数,所以也可以被匹配。
- addRule('/abc?dd=haha'):带 query 参数的 uri 串,包含 dd 参数且值为 haha。比如/abc?dd=haha和/abc?dd=haha&bb=123会被匹配,而/abc?dd=123` 就不会被匹配,因为规则要求了 dd 参数的值。
以上写法中的 uri 串如果只有 path 部分,则会取全局 origin 进行补全。比如全局 origin 是 https://weixin.qq.com,而规则是 /abc,则会补全为 https://weixin.qq.com/abc。因此在前面例子中 addRule('/abc') 和 addRule('https://weixin.qq.com/abc') 的写法效果一致。所以一般情况下如果需要匹配的请求 origin 和全局 origin 一致,则规则中可忽略不写 orign。
正则写法
- addRule(//(abc|cba)$/ig):直接正则匹配请求的 uri,同时会比对请求 origin 和全局 origin 是否一致。
- addRule(/^https://weixin.qq.com/(abc|cba)$/ig):带有 orign 部分的正则表达式,则只匹配 uri,不再比对 origin。
对象写法
使用规则对象,可以更为详细的描述规则内容。(一般使用规则对象,是为了匹配请求参数)
规则对象:
属性名 | 类型 | 默认值 | 备注 |
---|---|---|---|
id | string | 规则 id,如果不填则会由基础库生成 | |
method | string | 请求方法,可选值 GET/POST/PATCH/PUT/DELETE,如果为空则表示前面提到的所有方法都能被匹配到 | |
url | any | 必填 | uri 匹配规则,可参考规则字符串写法和正则写法 |
maxAge | number | 7 * 24 * 60 * 60 * 1000 | 缓存有效时间,单位为 ms,不填则默认取缓存管理器全局的缓存有效时间 |
dataSchema | Array<DataRule> | 匹配请求参数 |
其中,dataSchema 用来匹配对象类型的请求参数(比如 wx.request 的 data),默认可以不填,即不做参数匹配。
dataSchema 的类型是一个 DataRule 对象数组,一个 DataRule 对象描述一个参数,比如一个 wx.request 请求的 data 是 {a: 123, b: 'haha', c: true}
,你想要用一条规则来匹配其中的 a 和 b 参数,如果 a 是数字且 b 是字符串就能命中该规则,那么就需要在 dataSchema 中补充两个 DataRule 对象,即 [{name: 'a', schema: {type: 'number'}}, {name: 'b', schema: {type: 'string'}}]
。
DataRule 对象:
属性名 | 类型 | 默认值 | 备注 |
---|---|---|---|
name | string | 需要匹配的参数名 | |
schema | DataSchema/Array<DataSchema> | 需要匹配的参数模式,支持数组,表示该参数值有多种模式 |
name 表示要匹配的参数名,schema 为 DataSchema 对象,用来描述该参数的类型和值。
一个 DataRule 对象也可以匹配可能拥有多种类型的参数,所以 schema 也支持为 DataSchema 对象数组。比如上述例子中,希望匹配的 a 参数必须是数值或者字符串,那么可以这么写:{name: 'a', schema: [{type: 'number'}, {type: 'string'}]}。
DataSchema 对象:
属性名 | 类型 | 默认值 | 备注 |
---|---|---|---|
type | string | 需要匹配的 data 对象的参数类型,支持 string、number、boolean、null、object、any(表示任意类型),同时支持数组模式(数组模式则在类型后面加 [],如 string[] 表示字符串数组) | |
value | string/regexp/function/Array<DataRule> | 需要匹配的 data 对象的参数值,当 type 为基本类型时,可以用 string/regexp 来匹配固定的值,也可以通过 function 来确定值是否匹配,如果传入的 type 是 object,那么表示需要嵌套匹配值是否正确,可以传入 Array |
补充说明 用户可以添加多条规则,每条规则都会去解析网络请求,然后判断是否命中规则。假设有多条规则命中,则取第一条命中的规则。
type 参数表示要匹配的参数类型,value 表示要匹配的参数值。其中 value 支持多种写法,不同写法有如下匹配方式:
- 字符串写法:直接判值的字符串形式是否和给定字符串一样,比如 value 值为 123,就要求参数值必须为 123 才能与之匹配。
- 正则写法:直接判值的字符串形式是否能被正则匹配,比如 value 值为 /\d+/ig,就要求参数值必须为数字,如果参数值为 abc 则不会被匹配。
- 函数写法:在匹配时会调用用户传入的函数,交由用户判断是否匹配。
- DataRule 数组写法:当参数类型为对象时,那么字符串写法和正则写法就无法使用,需要传入 DataRule 数组来进行匹配,即通过嵌套 DataRule 数组的方式来匹配嵌套的对象。
示例代码
const ruleId = cacheManager.addRule({
id: 'haha-rule',
method: 'GET',
url: '/haha',
maxAge: 123455,
dataSchema: [
// data 字段的匹配,默认为空,表示不匹配
// 类型可以是:string、number、boolean、null、object、any(表示任意类型均可),以及这些类型的数组表示方式
{name: 'aaa', schema: {type: 'string'}}, // 类型为 string
{name: 'bbb', schema: [{type: 'number'}, {type: 'string'}]}, // 类型为 number, string
{name: 'ccc', schema: {type: 'string', value: 'abc'}}, // 值为 abc
{name: 'ddd', schema: {type: 'string', value: /(abc|cba)/ig}}, // 值符合该正则匹配,如果该值不是字符串类型,则会被尝试转成字符串后再进行比较
{name: 'ddd', schema: {type: 'string', value: val => val === '123'}}, // 传入函数来校验值
{name: 'eee', schema: {type: 'object', value: [{ // 类型为对象,则通过嵌套的方式来逐层校验
name: 'aaa', schema: {type: 'string'},
// ...
// 嵌套 dataSchema,同上面的方式一样来匹配嵌套的对象
}]}},
{name: 'fff', schema: {type: 'string[]'}}, // 类型为 string 数组
{name: 'ggg', schema: {type: 'any'}}, // 类型为任意类型
{name: 'hhh', schema: {type: 'any[]'}}, // 类型为任意类型的数组
}],
})
# CacheManager.addRules
批量添加规则,规则写法可参考 CacheManager.addRule。
参数 Object rules
规则列表
返回值 Array
规则 id 列表
# CacheManager.clearCaches
清空所有缓存。
# CacheManager.clearRules
清空所有规则,同时会删除对应规则下所有缓存。
# CacheManager.deleteCache
删除缓存。
参数 string id
缓存 id
# CacheManager.deleteCaches
批量删除缓存。
参数 Array
缓存 id 列表
# CacheManager.deleteRule
删除规则,同时会删除对应规则下所有缓存。
参数 string id
规则 id
# CacheManager.deleteRules
批量删除规则,同时会删除对应规则下所有缓存。
参数 Array ids
规则 id 列表
# CacheManager.match
匹配命中的缓存规则,一般需要和 request 事件搭配使用。
参数 Object evt
request 事件对象
返回值 Object
匹配到的缓存
属性 | 类型 | 说明 |
---|---|---|
ruleId | string | 命中的规则 id |
cacheId | string | 缓存 id |
data | any | 缓存内容,会带有 fromCache 标记,方便开发者区分内容是否来自缓存 |
createTime | number | 缓存创建时间 |
maxAge | number | 缓存有效时间 |
示例代码
function handler(evt) {
const cache = cacheManager.match(evt)
// 若有重复监听,则取第一个 handler 返回的 promise
return new Promise((resolve, reject) => {
if (cache.data) {
resolve(cache.data)
} else {
reject('no cache')
}
})
}
cacheManager.on('request', handler)
# CacheManager.off
取消事件监听。
参数 string eventName
事件名
function handler
事件句柄
# CacheManager.on
监听事件。
参数 string eventName
事件名
eventName 的合法值
值 | 说明 | 最低版本 |
---|---|---|
request | 发生 wx.request 请求,只在缓存管理器开启阶段会触发 | |
enterWeakNetwork | 进入弱网/离线状态 | |
exitWeakNetwork | 离开弱网/离线状态 |
function handler
事件句柄
这里 request 事件会提供 request 事件对象,用于做后续的处理;在 request 事件中需要返回一个 promise,用来生成 wx.request 请求的返回内容。
示例代码
async function handler(evt) {
// evt.url - 请求 url
// evt.data - 请求参数
// evt.method - 请求方法
// evt.request - 原始 request 方法,返回一个 promise
// if (evt.url === '/xxx') {
// // 如果有些请求仍然希望走到网络,则可以如下处理
// const res = await evt.request()
// // res 即为网络请求返回
// }
return new Promsie((resolve, reject) => {
// do sth
if (data) {
// 这里 resolve 的 data 就会作为 wx.request 的 success 回调结果返回
resolve(data)
} else {
// 这里 reject 的错误信息就会作为 wx.request 的 fail 回调结果返回
reject('no data')
}
})
}
cacheManager.on('request', handler)
# CacheManager.start
开启缓存,仅在 mode 为 none 时生效,调用后缓存管理器的 state 会置为 1。
# CacheManager.stop
关闭缓存,仅在 mode 为 none 时生效,调用后缓存管理器的 state 会置为 0。