# DNS缓存实现计划

## 问题分析
当前DNS缓存只支持内存缓存，需要扩展为支持文件缓存或内存缓存两种方式，并添加缓存大小和TTL限制。

## 实现目标
- 支持文件缓存和内存缓存两种模式
- 支持设置缓存大小（MB），0表示不缓存
- 支持设置最大和最小TTL
- 保持原有的LRU缓存机制
- 支持持久化存储（文件缓存模式）
- 确保线程安全

## 实现方案

### 1. 修改配置结构
- 在`DNSConfig`中添加：
  - `CacheMode`：缓存模式，可选值："memory"（内存缓存）或"file"（文件缓存）
  - `CacheSize`：缓存大小（MB），0表示不缓存
  - `MaxCacheTTL`：最大缓存TTL（分钟）
  - `MinCacheTTL`：最小缓存TTL（分钟）
  - `CacheFilePath`：缓存文件路径（文件缓存模式使用）

### 2. 重构缓存实现
- 创建`CacheItem`结构：包含响应、过期时间、大小等信息
- 创建`CacheInterface`接口：定义缓存的基本操作
- 实现`MemoryCache`：基于内存的LRU缓存
- 实现`FileCache`：基于文件的缓存，使用内存缓存+定期持久化

### 3. 缓存大小管理
- 为每个缓存项计算大小
- 维护总缓存大小计数器
- 当超过最大缓存大小时，淘汰最久未使用的项
- 支持设置0表示不缓存

### 4. TTL管理
- 支持设置最大和最小TTL
- 解析响应时，取响应TTL、最大TTL、最小TTL的合理值
- 确保缓存项不会无限期缓存

### 5. 文件缓存实现
- 内存缓存作为主缓存
- 定期将内存缓存持久化到文件
- 启动时从文件加载缓存
- 支持缓存文件的压缩和优化

### 6. 缓存策略
- LRU淘汰算法
- 定期清理过期缓存
- 支持缓存项大小计算
- 支持缓存统计

## 实现步骤

1. **修改配置**
   - 在`config/config.go`中扩展`DNSConfig`结构
   - 添加默认值处理

2. **实现缓存接口**
   - 在`dns/cache.go`中定义`CacheInterface`
   - 实现`CacheItem`结构

3. **实现内存缓存**
   - 实现`MemoryCache`结构
   - 实现LRU淘汰逻辑
   - 实现缓存大小管理

4. **实现文件缓存**
   - 实现`FileCache`结构，包装`MemoryCache`
   - 实现定期持久化逻辑
   - 实现从文件加载缓存

5. **集成到DNS服务器**
   - 修改`dns/server.go`中的缓存初始化
   - 根据配置选择缓存模式
   - 传递正确的缓存参数

6. **添加统计和监控**
   - 支持获取缓存统计信息
   - 支持手动清理缓存

## 技术要点

- **缓存大小计算**：计算每个DNS响应的大小
- **TTL处理**：合理处理不同来源的TTL值
- **文件格式**：使用JSON或二进制格式，平衡性能和可读性
- **并发安全**：使用读写锁保护缓存操作
- **错误处理**：优雅处理文件IO错误
- **性能优化**：减少文件IO次数，使用批量操作

## 预期效果

- 灵活的缓存配置选项
- 支持不同场景的缓存需求
- 提高DNS解析性能
- 减少对上游DNS服务器的依赖
- 支持缓存持久化
- 更好的资源管理