feat(cache): 引入 LRU 缓存并优化缓存清理与 TTL 处理

- 使用 github.com/hashicorp/golang-lru/v2 替代原生 sync.Map 实现 LRU 缓存
- 修复缓存读写过程中的并发安全问题,使用 RWMutex 保护共享状态
- 调整缓存键结构注释,明确支持 TTL 和 LRU 策略
- 优化负面缓存 TTL 计算逻辑,更准确识别 NODATA 场景
- 在缓存写入前统一剥离伪 RR(如 OPT、TSIG)
- 增加 cache-size 命令行参数,支持配置 LRU 缓存最大条目数
- 移除旧的缓存清理协程中不必要的全量遍历逻辑
- 更新日志输出内容,包含 cache-size 配置项
```
This commit is contained in:
2025-10-14 16:37:39 +08:00
parent bcd0914b2f
commit 916a7c8127
7 changed files with 430 additions and 213 deletions

32
Dockerfile Normal file
View File

@@ -0,0 +1,32 @@
# ---------- 构建阶段 ----------
FROM golang:1.25.2-alpine AS builder
WORKDIR /app
COPY . .
ENV CGO_ENABLED=0 GOOS=linux GOARCH=amd64
RUN go build -o dot main.go
# ---------- 运行阶段 ----------
FROM alpine:3.20
WORKDIR /app
# 只复制编译好的二进制,不再打包证书
COPY --from=builder /app/dot /app/dot
# 运行时定义可覆盖的环境变量(不在构建时生效)
ENV CERT_FILE=aixiao.me.cer
ENV KEY_FILE=aixiao.me.key
EXPOSE 853/tcp
# 启动命令,使用运行时传入的证书路径
ENTRYPOINT ["sh", "-c", "./dot \
-cert ${CERT_FILE} \
-key ${KEY_FILE} \
-addr :853 \
-upstream \"119.29.29.29:53,223.5.5.5:53,114.114.114.114:53\" \
-cache-ttl 300s \
-timeout 3s \
-max-parallel 3"]