124 lines
2.6 KiB
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
|
|
}
|