文章目录前言一、什么是内存缓存二、CacheUtil 源码解析三、6 个核心 API 详解3.1 getT — 读取缓存3.2 putT — 写入缓存3.3 remove — 删除缓存3.4 has — 检查是否存在3.5 isEmpty — 判断缓存是否为空3.6 clear — 清空所有缓存四、完整 Demo 演示4.1 缓存存取操作4.2 读取缓存4.3 删除缓存4.4 清空全部4.5 状态概览 UI五、CacheUtil 在 ClickUtil 中的实战应用六、API 速查表七、注意事项八、小结前言近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓一、什么是内存缓存内存缓存In-Memory Cache是将数据临时保存在内存中的一种机制。相比每次都从网络、数据库或文件系统获取数据内存缓存的读取速度快了几个数量级。常见使用场景防止重复网络请求将接口返回的数据缓存短时间内复用存储计算结果复杂计算的结果缓存避免重复运算临时状态共享不同组件之间传递临时状态不需要持久化定时器 ID 管理ClickUtil的防抖功能就依赖CacheUtil存储timeoutID二、CacheUtil 源码解析CacheUtil使用一个私有的Recordstring, Object作为存储容器exportclassCacheUtil{privatestaticcache:Recordstring,Object{};//私有缓存对象Recordstring, Object是 TypeScript/ArkTS 的内置工具类型相当于一个键为 string、值为任意 Object 类型的字典。整个缓存是类级别的静态变量也就是说它在 App 运行期间一直存在在所有组件之间共享同一份缓存。三、6 个核心 API 详解效果演示3.1 get — 读取缓存staticgetT(key:string):T{returnCacheUtil.cache[key]asT;}参数key缓存键名返回泛型T使用时需要指定类型示例consttokenCacheUtil.getstring(userToken);constcountCacheUtil.getnumber(clickCount);constuserCacheUtil.getUserInfo(currentUser);注意如果 key 不存在返回undefined建议先用has()判断后再取值。3.2 put — 写入缓存staticputT(key:string,value:T):void{CacheUtil.cache[key]valueasObject;}参数key缓存键名value任意类型的值会被强转为 Object 存储示例CacheUtil.putstring(userToken,eyJhbGciOi...);CacheUtil.putnumber(retryCount,3);CacheUtil.putboolean(isLoggedIn,true);CacheUtil.putstring[](tags,[HarmonyOS,ArkTS]);3.3 remove — 删除缓存staticremove(key:string){ObjectUtil.deleteRecord(CacheUtil.cache,key);}删除指定键的缓存项。内部委托给ObjectUtil.deleteRecord处理确保正确删除 Record 中的键。示例CacheUtil.remove(userToken);3.4 has — 检查是否存在statichas(key:string):boolean{letkeysObject.keys(CacheUtil.cache);returnkeys.indexOf(key)0}返回如果该 key 存在于缓存中返回true否则返回false示例if(CacheUtil.has(userToken)){consttokenCacheUtil.getstring(userToken);}3.5 isEmpty — 判断缓存是否为空staticisEmpty():boolean{letkeysObject.keys(CacheUtil.cache);returnkeys.length0;}返回缓存中没有任何数据时返回true示例if(CacheUtil.isEmpty()){console.log(缓存为空需要重新加载数据);}3.6 clear — 清空所有缓存staticclear():void{CacheUtil.cache{};}将缓存对象重置为空对象所有缓存数据均被清除。示例// 用户退出登录时清空所有缓存CacheUtil.clear();四、完整 Demo 演示以下代码来自CacheCharClickDemoPage.etsCacheUtil 部分展示了完整的缓存操作4.1 缓存存取操作cachePut(){if(this.cacheKeyInput.trim()){this.addLog(Cache,Key 不能为空,warn);return;}letvalue:string|number|boolean;if(this.cacheTypeSelect0){valuethis.cacheValueInput;}elseif(this.cacheTypeSelect1){valueNumber(this.cacheValueInput)||0;}else{valuethis.cacheValueInput.toLowerCase()true;}CacheUtil.put(this.cacheKeyInput.trim(),value);this.addLog(Cache,put(${this.cacheKeyInput},${value}) 成功,success);this.refreshCacheList();}根据用户选择的类型String/Number/Boolean将输入值转换后存入缓存。4.2 读取缓存cacheGet(){if(this.cacheKeyInput.trim()){this.addLog(Cache,请输入 Key,warn);return;}consthasCacheUtil.has(this.cacheKeyInput.trim());if(!has){this.addLog(Cache,Key ${this.cacheKeyInput} 不存在,warn);return;}constvalCacheUtil.getstring|number|boolean(this.cacheKeyInput.trim());this.addLog(Cache,get(${this.cacheKeyInput}) ${val},success);}先用has()检查再用get()读取是标准的安全读取模式。4.3 删除缓存cacheRemove(){if(this.cacheKeyInput.trim()){this.addLog(Cache,请输入 Key,warn);return;}CacheUtil.remove(this.cacheKeyInput.trim());this.addLog(Cache,remove(${this.cacheKeyInput}) 已删除,success);this.refreshCacheList();}4.4 清空全部cacheClearAll(){CacheUtil.clear();this.addLog(Cache,clear() 所有缓存已清空,success);this.refreshCacheList();}4.5 状态概览 UIRow(){Column(){Text(${CacheUtil.isEmpty()?⏸️ 空: 有数据}).fontSize(13).fontWeight(FontWeight.Bold).fontColor(CacheUtil.isEmpty()?#FF9800:#00C853)Text(缓存状态).fontSize(11).fontColor(#888)}.layoutWeight(1)Column(){Text(${this.cacheEntries.length}).fontSize(13).fontWeight(FontWeight.Bold).fontColor(#4080FF)Text(条目数).fontSize(11).fontColor(#888)}.layoutWeight(1)Column(){Text(CacheUtil.has(test_key)?✅:❌).fontSize(13)Text(has(test_key)).fontSize(11).fontColor(#888)}.layoutWeight(1)}实时展示缓存是否为空、条目数量、以及特定 key 是否存在。五、CacheUtil 在 ClickUtil 中的实战应用CacheUtil的典型应用是为ClickUtil的防抖功能存储定时器 ID// ClickUtil.ets 内部staticdebounce(func:()void,wait:number1000,clickId:stringClickUtil.defaultId){letcacheIDCacheUtil.getnumber(ClickUtil_debounce_timeoutID_${clickId});//获取idif(cacheID!undefinedcacheID!null){clearTimeout(cacheID);}lettimeoutIDsetTimeout((){typeoffuncfunctionfunc();clearTimeout(timeoutID);},wait);CacheUtil.putnumber(ClickUtil_debounce_timeoutID_${clickId},timeoutID);//缓存id}这里CacheUtil充当了全局变量的角色通过 key 区分不同的防抖事件实现了多个独立的防抖定时器管理。六、API 速查表方法说明返回值getT(key)根据 Key 获取缓存值T可能是 undefinedputT(key, val)存入缓存值可为任意类型voidremove(key)删除指定 Key 的缓存voidhas(key)判断 Key 是否存在booleanisEmpty()判断缓存是否为空booleanclear()清空所有缓存void七、注意事项内存缓存不持久化App 重启后缓存数据丢失不适合存储需要持久保存的数据用PreferencesUtil或AssetUtil类型安全使用泛型时需要自己保证读取时的类型与存入时一致全局共享所有组件共享同一份缓存key 的命名要有语义避免冲突如加业务前缀user_/config_内存占用频繁存入大对象可能导致内存增长记得及时remove或定期clear八、小结CacheUtil是一个简单但实用的内存缓存工具轻量仅依赖一个Record对象无外部依赖泛型支持getT和putT支持存储任意类型API 直观6 个方法对应完整的 CRUD 生命周期内部依赖ClickUtil等工具类内部使用是整个工具集的基础设施掌握CacheUtil是理解整个工具集协作机制的重要一步。