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