Flutter缓存管理插件lru的使用

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

Flutter缓存管理插件lru的使用

LRU Cache

LRU Cache 是一个基于最近最少使用( (Least Recently Used) 策略的缓存实现。它支持缓存超过容量的值,这些值会在垃圾回收时被缓存。

LRU Cache 还支持额外的 eviction 策略来限制 TypedData 的最大容量,这对于缓存像原始图像这样的缓冲区非常有用。

功能

  • 支持完整的 Map 接口。
  • 存储 TypedData 并通过 LruTypedDataCache 来移除条目。
  • 可以通过 LruWeakCache 选项性地缓存 Expando 兼容的对象。

使用方法

创建缓存、添加值,当空间耗尽时:

// no weak cache, because String is not supported by Expando
final cache = new LruCache<int, String>(2);

cache[0] = '0';
cache[1] = '1';
cache[2] = '2'; // key 0 is evicted here

cache[0]; // try to touch

print(cache[0]); // null
print(cache[1]); // 1
print(cache[2]); // 2

示例代码如下:

import 'package:lru/lru.dart';

/// Helper class to demonstrate LruWeakCache
class Key {
  const Key(this.key);
  final String key;
  @override
  String toString() => key;
}

void main() {
  {
    // no weak cache, because String is not supported by Expando
    final cache = LruCache<int, String>(2);

    cache[0] = '0';
    cache[1] = '1';
    cache[2] = '2'; // key 0 is evicted here

    cache[0]; // try to touch

    print(cache[0]); // null
    print(cache[1]); //  e
    print(cache[2]); // 2
  }
  {
    // use capacityInBytes as additional eviction strategy
    final cache = LruTypedDataCache<int, Uint8List>(capacity: 100, capacityInBytes: 2);
    cache[0] = Uint8List(1)..[0] = 0;
    cache[1] = Uint8List(1)..[0] = 1;
    cache[2] = Uint8List( )..[0] = 2;

    print(cache[0]); // null
    print(cache[ ]); // [1]
    print(cache[2]); // [2]
  }
  {
    final cache = LruWeakCache<int, Key>(2);

    cache[0] = Key('0');
    cache[ ] = Key('1');
    cache[2] = Key('2'); // key 0 is evicted from LRU and moved to weak cache

    // try to touch, if key 0 is not garbage collected yet
    // key 1 is moved to weak cache, and key 0 is restored
    cache[0];

    print(cache[0]); // likely 0
    print(cache[ ]); // likely 1
    print(cache[2]); // 2
  }
}

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

1 回复

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


在Flutter中,缓存管理对于提升应用性能和用户体验至关重要。LRU(Least Recently Used,最近最少使用)缓存策略是一种常见的缓存淘汰算法,用于在缓存空间有限时淘汰最久未使用的缓存项。

在Flutter中,你可以使用cached_network_image包结合自定义LRU缓存策略来实现图像缓存管理,或者使用一些专门管理LRU缓存的第三方库。不过,Flutter本身没有内置的LRU缓存管理插件,因此我们需要借助一些社区提供的包,或者直接实现一个简单的LRU缓存逻辑。

下面是一个使用Dart语言实现的简单LRU缓存管理的示例代码。这个示例展示了如何使用一个LinkedHashMap来实现LRU缓存策略,因为LinkedHashMap本身支持按照访问顺序或插入顺序进行排序。

import 'package:collection/collection.dart';

class LRUCache<K, V> {
  final int capacity;
  final Map<K, V> _cache;

  LRUCache(this.capacity)
      : _cache = LinkedHashMap<K, V>(
            capacity: capacity,
            evictionCallback: _onEviction,
          ) {
    _cache.protectKeysDuringIteration = true;
  }

  void _onEviction(K key, V value) {
    // 可以在这里处理缓存项被淘汰时的逻辑
    print('Evicted: $key -> $value');
  }

  V? get(K key) {
    return _cache.putIfAbsent(key, () => null)?.value;
  }

  void put(K key, V value) {
    _cache[key] = value;
  }

  bool containsKey(K key) {
    return _cache.containsKey(key);
  }

  void remove(K key) {
    _cache.remove(key);
  }

  void clear() {
    _cache.clear();
  }

  int get size => _cache.length;
}

void main() {
  final lruCache = LRUCache<String, String>(3);

  lruCache.put('1', 'one');
  lruCache.put('2', 'two');
  lruCache.put('3', 'three');

  print(lruCache.get('1')); // 输出: one
  lruCache.put('4', 'four'); // 此时缓存容量达到上限,'2' 将被淘汰

  print(lruCache.containsKey('2')); // 输出: false
  print(lruCache.containsKey('4')); // 输出: true

  lruCache.put('5', 'five'); // 此时缓存容量再次达到上限,'1' 将被淘汰

  print(lruCache.containsKey('1')); // 输出: false
  print(lruCache.size); // 输出: 3
}

在这个示例中,我们创建了一个LRUCache类,它使用一个LinkedHashMap来存储缓存项。当缓存达到容量上限时,最久未使用的缓存项将被淘汰。

注意,这个示例是一个简单的LRU缓存实现,没有考虑线程安全或其他高级特性。如果你需要一个更健壮的缓存解决方案,可以考虑使用像flutter_cache_manager这样的第三方库,它提供了更丰富的功能和更好的性能。不过,这些库可能并不直接提供LRU策略,而是提供了基于时间或其他策略的缓存管理。如果你确实需要LRU策略,你可以基于上述代码进行扩展,或者寻找一个专门提供LRU缓存管理的Flutter插件。

回到顶部