Flutter内存缓存管理插件lru_cache的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter内存缓存管理插件lru_cache的使用

lru_cache 是一个Dart包,提供了一个简单且高效的LRU(最近最少使用)缓存实现。该包使用Dart内置的 LinkedHashMap 来根据元素的访问历史维护顺序,适用于需要限制缓存项数量并在缓存达到最大容量时驱逐最不常用的项的场景。

特性

  • LRU(最近最少使用)缓存:跟踪最近访问的项目,并在缓存达到最大容量时驱逐最不常用的项目。
  • 可自定义的大小计算:通过 sizeOf 方法自定义缓存项的大小计算方式,以适应特定的使用场景。
  • 线程安全操作:使用同步方法确保在访问和修改缓存时的线程安全性,使其适合并发使用。

入门 🎉

要在Dart项目中使用 lru_cache,请将其添加到 pubspec.yaml 文件中:

dependencies:
  lru_cache: ^latest_version

使用示例

以下是一个如何使用 LruCache 类的完整示例代码:

import 'package:lru_cache/lru_cache.dart';

void main() {
  // 创建一个最大容量为2的LruCache
  final cache = LruCache<String, String>(2);

  // 将键值对放入缓存
  cache.put('key1', 'value1');
  cache.put('key2', 'value2');

  // 从缓存中检索值
  print(cache.get('key1')); // 输出 'value1'
  print(cache.get('key2')); // 输出 'value2'

  // 添加另一个键值对,驱逐最不常用的项
  cache.put('key3', 'value3');
  print(cache.get('key1')); // 输出 'null',因为 'key1' 被驱逐

  // 检索剩余的项
  print(cache.get('key2')); // 输出 'value2'
  print(cache.get('key3')); // 输出 'value3'

  // 显示缓存统计信息
  print(cache.toString()); // 输出 'LruCache[maxSize=2,hits=2,misses=1,hitRate=66%]'
}

自定义大小计算

LruCache 支持通过 sizeOf 方法自定义缓存项的大小计算。例如,如果你希望根据键或值的长度来计算缓存项的大小,可以这样做:

import 'package:lru_cache/lru_cache.dart';

void main() {
  // 创建一个最大容量为10的LruCache,并自定义大小计算
  final cache = LruCache<String, String>(
    10,
    sizeOf: (key, value) => key.length + value.length,
  );

  // 将键值对放入缓存
  cache.put('key1', 'value1'); // 占用 4 个单位 (4 = 4 + 0)
  cache.put('key2', 'longerValue'); // 占用 12 个单位 (12 = 4 + 8)

  // 从缓存中检索值
  print(cache.get('key1')); // 输出 'value1'
  print(cache.get('key2')); // 输出 'longerValue'

  // 添加另一个键值对,驱逐最不常用的项
  cache.put('key3', 'anotherValue'); // 占用 14 个单位 (14 = 6 + 8),超过最大容量
  print(cache.get('key1')); // 输出 'null',因为 'key1' 被驱逐

  // 检索剩余的项
  print(cache.get('key2')); // 输出 'longerValue'
  print(cache.get('key3')); // 输出 'anotherValue'

  // 显示缓存统计信息
  print(cache.toString()); // 输出 'LruCache[maxSize=10,hits=2,misses=1,hitRate=66%]'
}

线程安全

LruCache 提供了线程安全的操作,确保在多线程环境下访问和修改缓存时不会出现竞态条件。你可以放心地在并发环境中使用它。

完整的Flutter示例

下面是一个完整的Flutter应用程序示例,展示了如何在Flutter中使用 lru_cache

import 'package:flutter/material.dart';
import 'package:lru_cache/lru_cache.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'LRU Cache Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CacheExamplePage(),
    );
  }
}

class CacheExamplePage extends StatefulWidget {
  [@override](/user/override)
  _CacheExamplePageState createState() => _CacheExamplePageState();
}

class _CacheExamplePageState extends State<CacheExamplePage> {
  final LruCache<String, String> _cache = LruCache<String, String>(3);
  final TextEditingController _keyController = TextEditingController();
  final TextEditingController _valueController = TextEditingController();
  String _output = '';

  void _putValue() {
    final key = _keyController.text;
    final value = _valueController.text;
    if (key.isNotEmpty && value.isNotEmpty) {
      _cache.put(key, value);
      setState(() {
        _output = 'Put: $key -> $value\n$_output';
      });
    }
  }

  void _getValue() {
    final key = _keyController.text;
    if (key.isNotEmpty) {
      final value = _cache.get(key);
      setState(() {
        _output = 'Get: $key -> ${value ?? 'null'}\n$_output';
      });
    }
  }

  void _clearCache() {
    _cache.clear();
    setState(() {
      _output = 'Cache cleared\n$_output';
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('LRU Cache Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _keyController,
              decoration: InputDecoration(labelText: 'Key'),
            ),
            TextField(
              controller: _valueController,
              decoration: InputDecoration(labelText: 'Value'),
            ),
            SizedBox(height: 16),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                ElevatedButton(
                  onPressed: _putValue,
                  child: Text('Put'),
                ),
                ElevatedButton(
                  onPressed: _getValue,
                  child: Text('Get'),
                ),
                ElevatedButton(
                  onPressed: _clearCache,
                  child: Text('Clear Cache'),
                ),
              ],
            ),
            Expanded(
              child: SingleChildScrollView(
                child: Text(_output),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


在Flutter中,lru_cache 是一个用于内存缓存管理的插件,它基于LRU(Least Recently Used,最近最少使用)算法来管理缓存项。LRU算法会淘汰最久未使用的缓存项,以便在缓存空间有限时,优先保留最近使用的数据。

以下是如何在Flutter项目中使用 lru_cache 插件的一个示例代码。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 lru_cache 依赖:

dependencies:
  flutter:
    sdk: flutter
  lru_cache: ^x.y.z  # 请使用最新版本号替换 x.y.z

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 lru_cache 插件:

import 'package:lru_cache/lru_cache.dart';

3. 使用 LRUCache

以下是一个简单的示例,展示了如何创建和使用 LRUCache

void main() {
  // 创建一个 LRUCache 实例,设置最大容量为 5
  final cache = LRUCache<String, String>(capacity: 5);

  // 添加缓存项
  cache.put('key1', 'value1');
  cache.put('key2', 'value2');
  cache.put('key3', 'value3');
  cache.put('key4', 'value4');
  cache.put('key5', 'value5');

  // 访问某个缓存项,使其成为最近使用的项
  print(cache.get('key3'));  // 输出: value3

  // 添加一个新缓存项,这将导致最久未使用的项(key1)被移除
  cache.put('key6', 'value6');

  // 尝试获取已移除的项
  print(cache.get('key1'));  // 输出: null

  // 打印当前缓存中的所有项
  cache.forEach((key, value) {
    print('$key: $value');
  });

  // 输出可能如下(顺序可能不同,因为缓存项在访问后会重新排序):
  // key2: value2
  // key3: value3
  // key4: value4
  // key5: value5
  // key6: value6
}

代码解释

  1. 创建 LRUCache 实例

    final cache = LRUCache<String, String>(capacity: 5);
    

    这里我们创建了一个 LRUCache 实例,并设置了最大容量为 5。

  2. 添加缓存项

    cache.put('key1', 'value1');
    cache.put('key2', 'value2');
    ...
    

    使用 put 方法添加缓存项。

  3. 访问缓存项

    print(cache.get('key3'));  // 输出: value3
    

    使用 get 方法访问缓存项。访问某个缓存项会将其标记为最近使用。

  4. 添加新缓存项导致淘汰

    cache.put('key6', 'value6');
    

    当添加一个新的缓存项时,如果缓存已满,最久未使用的项(key1)将被移除。

  5. 遍历缓存项

    cache.forEach((key, value) {
      print('$key: $value');
    });
    

    使用 forEach 方法遍历当前缓存中的所有项。

通过上述示例,你可以看到 lru_cache 插件在 Flutter 项目中如何进行内存缓存管理。根据需要,你可以调整缓存的容量和存储的数据类型。

回到顶部