Carry の Blog Carry の Blog
首页
关于
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • OpenClaw
  • Hermes Agent
  • Claude Code
  • MySQL8-SOP手册
  • MySQL实战45讲学习笔记
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
关于
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • OpenClaw
  • Hermes Agent
  • Claude Code
  • MySQL8-SOP手册
  • MySQL实战45讲学习笔记
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL

  • Redis

  • Keydb

    • KeyDB 安装配置:号称吊打 Redis 的发行版
    • DragonflyDB 生产实践|58天稳定运行的轻量缓存方案
      • 一、为什么考虑替换?Redis 单线程的天然瓶颈
      • 二、部署手册:Docker 启动参数逐项解读
      • 三、使用指南:连接验证与监控三板斧
      • 四、58天运行数据:一个轻量但稳定的典型案例
      • 五、踩坑记录:三个容易被忽视的问题
        • 坑 #1:日志卷映射不生效,docker logs 才是正解
        • 坑 #2:CLUSTER NODES 警告不是报错,是客户端探测行为
        • 坑 #3:密码明文暴露在 ps 输出中有安全风险
      • 六、可复用要点
      • 七、Agent 可直接解析的元数据块
  • TiDB

  • MongoDB

  • Elasticsearch

  • Kafka

  • victoriametrics

  • BigData

  • Sqlserver

  • 数据库
  • Keydb
Carry の Blog
2026-08-27
目录

DragonflyDB 生产实践|58天稳定运行的轻量缓存方案原创

DragonflyDB 是一个相对较新的 Redis 替代方案,号称在多核利用率、内存效率和协议兼容性上都有突破。本文基于一个真实生产环境(某中型业务系统)的 58 天运行数据,复盘从选型到部署的完整过程,以及踩过的几个隐蔽的坑。

版本说明

  • DragonflyDB 版本:latest(2025年6月部署时拉取)
  • 客户端协议兼容:Redis 7.4.0
  • 部署方式:Docker
  • 运行时长:58 天(从 6月30日 部署至实地巡检日)

# 一、为什么考虑替换?Redis 单线程的天然瓶颈

在现有 Redis 主从集群之外,一些轻量级缓存场景(会话状态、临时计数、API 限流凭证)其实不需要完整的集群架构,但又希望单机性能更好。传统 Redis 的单线程模型在多核机器上是个明显的浪费——8 核甚至 16 核的机器,Redis 进程只能吃掉 1 个核,其余 7 个核干看着。

DragonflyDB 的核心卖点正好对应这个痛点:

  1. 多线程 IO:--proactor_threads 参数可以指定线程数,充分利用多核 CPU
  2. 内存效率优化:作者背景是原 Redis / GCP 内存优化方向,数据结构做了重新设计
  3. 协议 100% 兼容:INFO 命令返回 redis_version:7.4.0,任何 Redis 客户端库无需改代码

这三个特性让它成为「单机轻量缓存场景」的理想候选者——不是取代主 Redis 集群,而是补充那些对延迟敏感、但数据量不大的边缘缓存需求。

# 二、部署手册:Docker 启动参数逐项解读

部署在一台标准生产主机上,Docker 是最快的方式。以下是经过验证的启动命令:

docker run --rm --name dragonfly \
  --ulimit memlock=-1 \
  -p 6379:6379 \
  -v /data/dragonfly/data:/data \
  -v /data/dragonfly/log:/var/log/dragonfly \
  docker.dragonflydb.io/dragonflydb/dragonfly:latest \
  --dir=/data \
  --log_dir=/var/log/dragonfly \
  --maxmemory=20gb \
  --proactor_threads=14 \
  --dbfilename=dump \
  --maxclients=10000 \
  --version_check=false \
  --requirepass=<YOUR_PASSWORD>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

关键参数解析:

参数 作用 注意点
--ulimit memlock=-1 允许进程锁定内存 Dragonfly 使用 memlock 做内存优化,必须放开限制
--proactor_threads=14 多线程 IO 线程数 这是与 Redis 单线程的核心差异,建议设为物理核心数的 1-2 倍
--maxmemory=20gb 内存上限 达到上限后会按策略驱逐,不是 OOM killer
--dbfilename=dump 快照文件名前缀 实际生成 .dfs 分片格式,不是传统的单一 dump.rdb
--version_check=false 禁用版本检查 内网环境建议关闭,避免无意义的对外请求

目录与端口规划:

/data/dragonfly/
├── data/           # 持久化数据(.dfs 分片快照)
└── log/            # 日志目录(注意:实际日志走 docker logs,见下文坑 #1)

端口:6379(标准 Redis 端口,客户端零改动)
1
2
3
4
5

# 三、使用指南:连接验证与监控三板斧

DragonflyDB 对 Redis 协议的兼容性意味着你可以用任何熟悉的 Redis 客户端连接:

# 使用 redis-cli 连接(Dragonfly 没有专用 CLI)
redis-cli -p 6379 -a <password>
1
2

健康检查三板斧:

# 1. 服务端基本信息
redis-cli -p 6379 -a <password> INFO server
1
2

预期输出(关键字段):

redis_version:7.4.0
redis_mode:standalone
uptime_in_seconds:5011200
uptime_in_days:58
dragonfly_version:1.25.0
1
2
3
4
5
# 2. 内存使用情况
redis-cli -p 6379 -a <password> INFO memory
1
2

预期输出:

used_memory:63384576
used_memory_human:60.44M
maxmemory:21474836480
maxmemory_human:20.00G
1
2
3
4
# 3. Keyspace 统计(命中率)
redis-cli -p 6379 -a <password> INFO keyspace
1
2

预期输出:

db0:keys=1,expires=0,avg_ttl=0
db1:keys=18,expires=0,avg_ttl=0
db2:keys=6,expires=0,avg_ttl=0
db3:keys=4,expires=0,avg_ttl=0
1
2
3
4

命中率解读: 在实地巡检中,db1~db3 的命中率分别为 93%~96%,说明这个轻量缓存场景下的工作负载是被有效缓存的。

# 四、58天运行数据:一个轻量但稳定的典型案例

这台 Dragonfly 实例自 6月30日 部署以来,已经稳定运行 58 天。以下是 INFO 命令提取的关键指标:

指标 数值 说明
运行时间 58 天 无重启,无 OOM
内存使用 ~60 MB (RSS ~190 MB) 远低于 20GB 上限
Key 总数 29 个(分布在 4 个逻辑库) 典型的轻量缓存场景
累计命令处理 27,036 次 低频率访问,长期稳定
db1~db3 命中率 93%~96% 缓存有效

这个数据说明:DragonflyDB 在低负载、长期运行的边缘缓存场景下非常可靠。它不会因为没有大量流量就出问题——这比某些「高并发才能稳定」的系统更可控。

# 五、踩坑记录:三个容易被忽视的问题

# 坑 #1:日志卷映射不生效,docker logs 才是正解

启动命令里映射了 -v /data/dragonfly/log:/var/log/dragonfly,但实际进入该目录发现是空的。

原因:DragonflyDB 默认使用 --logtostderr,所有日志输出到 stderr,被 Docker 捕获到 docker logs 中,不会写入文件系统。

解药:如果确实需要日志文件,需显式添加 --logtostderr=false,或者改看 docker logs:

# 查看实时日志
docker logs -f dragonfly

# 查看最近 100 行
docker logs --tail 100 dragonfly
1
2
3
4
5

# 坑 #2:CLUSTER NODES 警告不是报错,是客户端探测行为

在 docker logs 中偶尔能看到这样的警告:

WARNING: Cluster is disabled
1

原因:一些 Redis Cluster 感知的客户端库(如 redis-py-cluster、ioredis)在连接时会自动探测集群拓扑,发送 CLUSTER NODES 命令。Dragonfly 在 standalone 模式下会返回这个警告,但不是错误。

解药:无需处理——这是客户端库的正常行为。除非你真的需要模拟集群协议(可以添加 --cluster_mode=emulated),否则忽略即可。

# 坑 #3:密码明文暴露在 ps 输出中有安全风险

启动命令中的 --requirepass=<password> 会直接暴露在进程列表中:

ps -ef | grep dragonfly
# 输出中能看到完整密码
1
2

任何能登录该主机的用户都可以通过 ps 看到密码。

解药:

  1. 推荐方案:使用 Dragonfly 支持的环境变量或配置文件方式传入密码,避免命令行参数
  2. 次选方案:严格控制主机本地用户权限,确保只有服务账户能查看进程
  3. 检查清单:部署后立即执行 ps -ef | grep dragonfly 验证密码是否暴露

# 六、可复用要点

  1. 选型原则:DragonflyDB 适合「单机、轻量、长期稳定」的缓存场景,不是 Redis Cluster 的替代品
  2. 部署模板:Docker 启动命令 --ulimit memlock=-1 和 --proactor_threads 必须成对出现,否则多线程优势发挥不出来
  3. 监控三板斧:INFO server(看运行时间)、INFO memory(看内存占比)、INFO keyspace(看命中率)
  4. 日志习惯养成:先看 docker logs,目录卷映射是空的——这是 feature 不是 bug
  5. 安全红线:生产环境必须用配置文件或环境变量传密码,绝不上命令行

# 七、Agent 可直接解析的元数据块

🤖 Agent 可直接解析的元数据块(点击展开)
{
  "_meta": {
    "doc_version": "2026-08-27",
    "article_id": "dragonflydb-production-cache",
    "profile_context": "any",
    "estimated_setup_time": "15min"
  },
  "quick_start": {
    "step_1": "mkdir -p /data/dragonfly/data /data/dragonfly/log",
    "step_2": "docker run --rm --name dragonfly --ulimit memlock=-1 -p 6379:6379 -v /data/dragonfly/data:/data docker.dragonflydb.io/dragonflydb/dragonfly:latest --dir=/data --maxmemory=20gb --proactor_threads=14 --requirepass=<password>",
    "step_3": "redis-cli -p 6379 -a <password> PING"
  },
  "safety_rules": [
    "--ulimit memlock=-1 必须在 docker run 中,否则 Dragonfly 无法优化内存",
    "--proactor_threads 建议设为物理 CPU 核心数的 1-2 倍",
    "生产环境 --requirepass 必须走配置文件或环境变量,禁止命令行明文",
    "日志查看用 docker logs,目录卷映射默认不写入文件"
  ],
  "verification": {
    "server_info": "redis-cli -p 6379 -a <password> INFO server | grep dragonfly_version",
    "memory_usage": "redis-cli -p 6379 -a <password> INFO memory | grep used_memory_human",
    "keyspace": "redis-cli -p 6379 -a <password> INFO keyspace",
    "process_check": "ps -ef | grep dragonfly | grep -v grep"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

AI Agent 使用指南:

  • 当用户说"帮我部署 DragonflyDB" → 执行 quick_start.step_1 到 step_3
  • 当用户说"验证部署是否成功" → 执行 verification.server_info 和 verification.keyspace
  • 当用户说"内存用得怎么样" → 执行 verification.memory_usage
#DragonflyDB#Redis#缓存#Docker#生产实践
上次更新: 8/27/2026

← KeyDB 安装配置:号称吊打 Redis 的发行版 TiCDC同步数据到Kafka→

最近更新
01
TiKV 也有"寿命":一次 795 天 tokio 定时器溢出 panic 的复盘与预警建设 原创
08-27
02
Hermes Agent 实战 18|MySQL 8 生产 SOP 是怎么长出来的 原创
08-27
03
Hermes Agent 实战 17|自建 ES 集群 vs 托管 RDS:纯成本量化推导 原创
08-27
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式