98 lines
3.0 KiB
Markdown
98 lines
3.0 KiB
Markdown
# 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服务器的依赖
|
||
- 支持缓存持久化
|
||
- 更好的资源管理 |