鸿蒙三方库 | harmony-utils之LRUCacheUtil LRU缓存策略详解
·
前言
LRU(Least Recently Used)是一种常用的缓存淘汰策略,当缓存满时自动淘汰最久未使用的数据。@pura/harmony-utils 的 LRUCacheUtil 封装了LRU缓存管理方法。本文将从API说明、代码实战、进阶用法、常见问题等多个维度进行全面讲解,帮助开发者快速掌握并应用到实际项目中。

一、LRUCacheUtil核心API
LRUCacheUtil 提供了以下LRU缓存管理方法:
| 方法 | 说明 | 返回类型 | 使用场景 |
|---|---|---|---|
put(key, value) |
写入缓存 | void | 数据缓存 |
get(key) |
读取缓存 | Object | 缓存查询 |
remove(key) |
删除缓存 | void | 缓存清理 |
size() |
获取缓存数量 | number | 容量监控 |
maxSize() |
获取最大容量 | number | 容量配置 |
1.1 核心特性
- 简洁易用:封装复杂API为一行调用,降低使用门槛
- 类型安全:完整的TypeScript类型定义,编译期即可发现错误
- 异常处理:内置异常捕获机制,避免运行时崩溃
- 自动淘汰:缓存满时自动淘汰最久未使用的数据
1.2 LRU淘汰策略说明
| 操作 | 影响 | 说明 |
|---|---|---|
| put | 添加/更新 | 新数据放在最前 |
| get | 访问提升 | 访问后移到最前 |
| 淘汰 | 移除最后 | 满时移除最久未用 |
二、完整使用步骤
2.1 安装依赖
ohpm install @pura/harmony-utils
2.2 使用LRU缓存
import { LRUCacheUtil } from '@pura/harmony-utils';
Button('写入LRU缓存')
.width('100%')
.onClick(() => {
try {
LRUCacheUtil.put('image_1', 'data_1');
LRUCacheUtil.put('image_2', 'data_2');
LRUCacheUtil.put('image_3', 'data_3');
this.result = `写入3条缓存 ✅\n当前数量: ${LRUCacheUtil.size()}`;
} catch (e) {
this.result = '异常: ' + e;
}
})
2.3 读取LRU缓存
Button('读取LRU缓存')
.width('100%')
.onClick(() => {
try {
let value = LRUCacheUtil.get('image_1');
this.result = value ? `缓存命中 ✅\n值: ${value}` : '缓存未命中 ❌';
} catch (e) {
this.result = '异常: ' + e;
}
})

三、完整页面示例
import { LRUCacheUtil } from '@pura/harmony-utils';
@Entry
@Component
struct LRUDemo {
@State result: string = '';
build() {
Column({ space: 12 }) {
Button('写入缓存').width('100%').onClick(() => {
LRUCacheUtil.put('k1', 'v1');
this.result = `数量: ${LRUCacheUtil.size()}/${LRUCacheUtil.maxSize()}`;
});
Button('读取缓存').width('100%').onClick(() => {
let v = LRUCacheUtil.get('k1');
this.result = `值: ${v || '未命中'}`;
});
Text(this.result).fontSize(14).fontColor('#333333')
}
.padding(16)
}
}
四、进阶用法
4.1 图片缓存
import { LRUCacheUtil } from '@pura/harmony-utils';
class ImageCache {
static put(url: string, pixelMap: PixelMap): void {
LRUCacheUtil.put('img_' + url, pixelMap);
}
static get(url: string): PixelMap | null {
return LRUCacheUtil.get('img_' + url) as PixelMap;
}
}
4.2 数据预加载
function preloadData(keys: string[]): void {
keys.forEach(key => {
let data = loadDataFromDB(key);
LRUCacheUtil.put(key, data);
});
}
五、注意事项
- 容量限制:LRU缓存有最大容量限制,超出自动淘汰
- 内存缓存:LRUCacheUtil为内存缓存,应用退出后数据丢失
- 访问顺序:get操作会改变数据在LRU中的顺序
- 初始化依赖:使用前需确保
AppUtil.init()已调用 - 大对象:避免缓存过大的对象,防止内存溢出
六、常见问题
Q1: 缓存满了怎么办?
LRU策略会自动淘汰最久未使用的数据,无需手动处理。
Q2: 如何调整最大容量?
可以在初始化时配置最大容量,具体方法参考库的配置说明。
Q3: LRU和普通缓存有什么区别?
普通缓存需要手动管理淘汰,LRU自动淘汰最久未使用的数据,更适合图片等场景。
Q4: get()会改变缓存顺序吗?
是的,get()会将数据移到最前面,表示最近使用。



总结
LRUCacheUtil 的LRU缓存策略为图片缓存等场景提供了自动淘汰机制。本文详细介绍了核心API、使用步骤、完整示例、进阶用法以及常见问题的解决方案。开发者可以利用LRU策略优化内存使用。
本文基于
@pura/harmony-utils工具库,更多功能请参考官方文档与后续系列文章。
更多推荐


所有评论(0)