swagger_generator_flutter/lib/utils/cache_manager.dart

124 lines
2.6 KiB
Dart

import 'dart:collection';
import 'package:swagger_generator_flutter/utils/string_utils.dart';
/// 缓存管理器
/// 提供简单的内存缓存功能
class CacheManager {
CacheManager();
static const int _maxMemoryItems = 100;
// 内存缓存
final Map<String, _CacheEntry> _memoryCache = {};
final Queue<String> _accessOrder = Queue<String>();
/// 从缓存获取数据
T? get<T>(String key) {
final entry = _memoryCache[key];
if (entry != null && !entry.isExpired) {
_updateAccessOrder(key);
return entry.value as T?;
}
return null;
}
/// 存储数据到缓存
void put<T>(String key, T value, [Duration? ttl]) {
ttl ??= const Duration(hours: 1);
// 检查内存缓存大小限制
if (_memoryCache.length >= _maxMemoryItems) {
_evictOldestItem();
}
final entry = _CacheEntry(
value: value,
expiresAt: DateTime.now().add(ttl),
);
_memoryCache[key] = entry;
_updateAccessOrder(key);
}
/// 检查是否存在缓存
bool has(String key) {
final entry = _memoryCache[key];
return entry != null && !entry.isExpired;
}
/// 删除缓存项
void remove(String key) {
_memoryCache.remove(key);
_accessOrder.removeWhere((k) => k == key);
}
/// 清空缓存
void clear() {
_memoryCache.clear();
_accessOrder.clear();
}
/// 获取缓存统计信息
CacheStats getStats() {
return CacheStats(
memoryItems: _memoryCache.length,
diskItems: 0,
hitRate: 0,
totalSize: 0,
);
}
/// 更新访问顺序
void _updateAccessOrder(String key) {
_accessOrder
..removeWhere((k) => k == key)
..addLast(key);
}
/// 驱逐最旧的项
void _evictOldestItem() {
if (_accessOrder.isNotEmpty) {
final oldestKey = _accessOrder.removeFirst();
_memoryCache.remove(oldestKey);
}
}
}
/// 缓存条目
class _CacheEntry {
_CacheEntry({
required this.value,
required this.expiresAt,
});
final dynamic value;
final DateTime expiresAt;
bool get isExpired => DateTime.now().isAfter(expiresAt);
}
/// 缓存统计信息
class CacheStats {
const CacheStats({
required this.memoryItems,
required this.diskItems,
required this.hitRate,
required this.totalSize,
});
final int memoryItems;
final int diskItems;
final double hitRate;
final int totalSize;
@override
String toString() {
return 'CacheStats{'
'memoryItems: $memoryItems, '
'diskItems: $diskItems, '
'hitRate: ${(hitRate * 100).toStringAsFixed(1)}%, '
'totalSize: ${StringUtils.formatBytes(totalSize)}'
'}';
}
// 已移动到 StringUtils.formatBytes
}