前言

LRU(Least Recently Used)是一种常用的缓存淘汰策略,当缓存满时自动淘汰最久未使用的数据。@pura/harmony-utilsLRUCacheUtil 封装了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);
  });
}

五、注意事项

  1. 容量限制:LRU缓存有最大容量限制,超出自动淘汰
  2. 内存缓存:LRUCacheUtil为内存缓存,应用退出后数据丢失
  3. 访问顺序:get操作会改变数据在LRU中的顺序
  4. 初始化依赖:使用前需确保 AppUtil.init() 已调用
  5. 大对象:避免缓存过大的对象,防止内存溢出

六、常见问题

Q1: 缓存满了怎么办?

LRU策略会自动淘汰最久未使用的数据,无需手动处理。

Q2: 如何调整最大容量?

可以在初始化时配置最大容量,具体方法参考库的配置说明。

Q3: LRU和普通缓存有什么区别?

普通缓存需要手动管理淘汰,LRU自动淘汰最久未使用的数据,更适合图片等场景。

Q4: get()会改变缓存顺序吗?

是的,get()会将数据移到最前面,表示最近使用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

LRUCacheUtil 的LRU缓存策略为图片缓存等场景提供了自动淘汰机制。本文详细介绍了核心API、使用步骤、完整示例、进阶用法以及常见问题的解决方案。开发者可以利用LRU策略优化内存使用。

本文基于 @pura/harmony-utils 工具库,更多功能请参考官方文档与后续系列文章。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐