Flutter本地缓存管理插件ecache的使用

Flutter本地缓存管理插件ecache的使用

Ecache是一个简单的库,用于实现内存缓存,并支持移除条目。

它受到gcache的启发。

特性

  • 支持基于最不常使用的项(LFU)过期
  • 支持基于最近最少使用的项(LRU)过期
  • 支持基于移除列表中的“第一个”条目过期
  • 支持弱引用存储(保证最小容量,额外项可能在不需要时被垃圾回收删除)
  • 支持基于持续时间的过期(过期)
  • 可选的项目清理回调

安装

pubspec.yaml文件中添加依赖:

dependencies:
  ecache: ^2.0.3

简单使用案例

以下是一个简单的使用案例:

import 'package:ecache/ecache.dart';

void main() {
  // 创建一个容量为20的简单缓存
  Cache c = SimpleCache(capacity: 20);

  // 设置键值对
  c.set("key", 42);
  
  // 获取键对应的值
  print(c.get("key")); // 输出:42
  
  // 检查是否存在某个键
  print(c.containsKey("unknown_key")); // 输出:false
  
  // 获取不存在的键的值
  print(c.get("unknown_key")); // 输出:nil
}

移除条目

可以设置回调函数来处理缓存项被移除的情况:

import 'package:ecache/ecache.dart';

void main() {
  // 创建一个容量为20的简单缓存,并设置移除回调
  Cache c = SimpleCache(
    capacity: 20,
    storage: SimpleStorage(
      onEvict: (key, value) {
        value.dispose(); // 在项被移除时进行清理
      },
    ),
  );

  // 设置键值对
  c.set("key", 42);
  
  // 获取键对应的值
  print(c.get("key")); // 输出:42
  
  // 检查是否存在某个键
  print(c.containsKey("unknown_key")); // 输出:false
  
  // 获取不存在的键的值
  print(c.get("unknown_key")); // 输出:nil
  
  // 获取指定键的值
  print(c["key"]); // 输出:42
  
  // 设置另一个键值对
  c["halfKey"] = 21;
}

获取统计信息

可以通过统计存储器获取缓存的统计信息:

import 'package:ecache/ecache.dart';

void main() {
  // 创建一个统计存储器
  var storage = StatisticsStorage();
  
  // 创建一个容量为20的简单缓存,并设置统计存储器
  Cache c = SimpleCache(storage: storage, capacity: 20);

  // 设置键值对
  c.set("key", 42);
  
  // 获取键对应的值
  print(c.get("key")); // 输出:42
  
  // 检查是否存在某个键
  print(c.containsKey("unknown_key")); // 输出:false
  
  // 获取不存在的键的值
  print(c.get("unknown_key")); // 输出:nil
  
  // 打印统计信息
  print(storage.toString());
}

弱引用

可以使用弱引用存储器来确保至少有20个项保留在缓存中。当添加更多项时,较旧的项将被移到弱引用缓存中。这个缓存可能会被垃圾回收在任何时间点删除。

import 'package:ecache/ecache.dart';

void main() {
  // 创建一个弱引用存储器
  var storage = WeakReferenceStorage();
  
  // 创建一个容量为20的简单缓存,并设置弱引用存储器
  Cache c = SimpleCache(storage: storage, capacity: 20);
}

// 在这个例子中,保证20个项保留在缓存中。当添加更多项时,较旧的项将被移到弱引用缓存中。
// 这个缓存可能会被垃圾回收在任何时间点删除。

// 因此,从缓存中检索这样的项时,可能或可能不会从弱引用缓存中返回该项,
// 取决于垃圾回收是否已经运行并删除了这些项。

// 注意,我们不能保证始终调用移除回调,因此不要同时使用移除和弱引用在同一缓存中。

更多关于Flutter本地缓存管理插件ecache的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地缓存管理插件ecache的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


ecache 是一个用于 Flutter 的本地缓存管理插件。它可以帮助你轻松地管理应用程序的缓存数据,支持内存缓存和持久化缓存,并且提供了简单的 API 来存储、获取和删除缓存数据。

以下是 ecache 插件的基本使用方法:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 ecache 插件的依赖:

dependencies:
  ecache: ^1.0.0

然后运行 flutter pub get 来安装依赖。

2. 初始化缓存管理器

在应用程序启动时,你可以初始化一个缓存管理器。你可以选择使用内存缓存、持久化缓存,或者两者结合。

import 'package:ecache/ecache.dart';

void main() {
  // 初始化内存缓存管理器
  var cacheManager = CacheManager(
    defaultExpiration: Duration(minutes: 30), // 默认缓存过期时间
    maxEntries: 100, // 最大缓存条目数
  );

  runApp(MyApp(cacheManager: cacheManager));
}

class MyApp extends StatelessWidget {
  final CacheManager cacheManager;

  MyApp({required this.cacheManager});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ECache Example',
      home: MyHomePage(cacheManager: cacheManager),
    );
  }
}

3. 使用缓存管理器

你可以在应用程序的任何地方使用缓存管理器来存储和获取缓存数据。

存储数据

void storeData() {
  cacheManager.set('key1', 'value1');
  cacheManager.set('key2', {'name': 'John', 'age': 30}, Duration(minutes: 10));
}

获取数据

void getData() {
  var value1 = cacheManager.get<String>('key1');
  var value2 = cacheManager.get<Map<String, dynamic>>('key2');

  print(value1); // 输出: value1
  print(value2); // 输出: {name: John, age: 30}
}

删除数据

void deleteData() {
  cacheManager.remove('key1');
}

清除所有缓存

void clearCache() {
  cacheManager.clear();
}

4. 持久化缓存

如果你需要将缓存数据持久化到本地存储,可以使用 DiskCacheManager。它基于 shared_preferences 插件实现。

import 'package:ecache/ecache.dart';

void main() {
  // 初始化持久化缓存管理器
  var diskCacheManager = DiskCacheManager(
    defaultExpiration: Duration(days: 7), // 默认缓存过期时间
    maxEntries: 1000, // 最大缓存条目数
  );

  runApp(MyApp(diskCacheManager: diskCacheManager));
}

class MyApp extends StatelessWidget {
  final DiskCacheManager diskCacheManager;

  MyApp({required this.diskCacheManager});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'ECache Example',
      home: MyHomePage(diskCacheManager: diskCacheManager),
    );
  }
}

5. 使用持久化缓存管理器

使用 DiskCacheManager 的方式与 CacheManager 类似。

void storeData() {
  diskCacheManager.set('key1', 'value1');
  diskCacheManager.set('key2', {'name': 'John', 'age': 30}, Duration(minutes: 10));
}

void getData() {
  var value1 = diskCacheManager.get<String>('key1');
  var value2 = diskCacheManager.get<Map<String, dynamic>>('key2');

  print(value1); // 输出: value1
  print(value2); // 输出: {name: John, age: 30}
}

void deleteData() {
  diskCacheManager.remove('key1');
}

void clearCache() {
  diskCacheManager.clear();
}

6. 混合使用内存和持久化缓存

你也可以同时使用内存缓存和持久化缓存,以便在内存中快速访问数据,并在应用重启后仍能保留数据。

void storeData() {
  cacheManager.set('key1', 'value1');
  diskCacheManager.set('key1', 'value1');
}

void getData() {
  var value1 = cacheManager.get<String>('key1') ?? diskCacheManager.get<String>('key1');
  print(value1);
}
回到顶部