import 'dart:collection'; import 'package:swagger_generator_flutter/utils/string_utils.dart'; /// 缓存管理器 /// 提供简单的内存缓存功能 class CacheManager { CacheManager(); static const int _maxMemoryItems = 100; // 内存缓存 final Map _memoryCache = {}; final Queue _accessOrder = Queue(); /// 从缓存获取数据 T? get(String key) { final entry = _memoryCache[key]; if (entry != null && !entry.isExpired) { _updateAccessOrder(key); return entry.value as T?; } return null; } /// 存储数据到缓存 void put(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 }