Dragonfly 内存数据库上手指南:10 分钟跑通并理解核心配置
【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly
Dragonfly 是一个用 C++ 编写的内存数据库,定位很直接:替代 Redis 和 Memcached,同时兼容两者的 API,业务代码不用改就能接入。它的多线程 shared-nothing 架构(把键空间切分给多个线程各自管理,避免单线程争抢)让吞吐量随核数线性扩展,官方基准里单实例做到了 3.8M QPS,是 Redis 单进程的 25 倍左右;相同负载下内存占用可少约 30%,快照期间内存几乎不涨。如果你正被 Redis 单线程的 CPU 瓶颈、多节点集群的运维复杂度困扰,这就是为它准备的上手路径。
适用场景:什么时候值得换 Dragonfly
先给结论:三种情况换过去收益最大,其余情况可以先观望。
- 大内存单机的 KV 缓存/会话存储:Redis 单进程吃不满 16 核以上的机器,Dragonfly 能垂直扩到 128 核级别,省掉搭集群的成本。
- 读写混合且写多的高 QPS 场景:官方对 Memcached 的压测中,SET 场景 Dragonfly 约 3844K QPS,Memcached 约 806K,写延迟也更低;GET 场景两者延迟接近,但 Dragonfly 吞吐仍是 2100K 对 1771K 量级的优势(以官方
docs/memcached_benchmark.md数据为准)。 - 需要缓存淘汰而不是持久化存储的场景:Dragonfly 内置自适应淘汰算法(类似 LRU/LFU 但零内存开销),开启
cache_mode后在逼近maxmemory时才踢掉"最不可能再被访问"的数据。
反过来,如果你的业务强依赖 Redis 的全部高级特性(如复杂数据结构命令全集),可以先对照docs/differences.md里的行为差异清单,再结合docs/faq.md评估命令覆盖度。
首次运行:一条 Docker 命令 + 一次写读验证
环境要求只有一个:机器上装好 Docker。Linux、macOS、Windows(WSL)都可以。
# Linux(使用宿主机网络) docker run --network=host --ulimit memlock=-1 docker.dragonflydb.io/dragonflydb/dragonfly⚠️ macOS 上
--network=host不可用,把参数换成-p 6379:6379即可。个别环境遇到初始化报错,可加--privileged重试。
启动后服务默认监听6379端口,并且同时响应 RESP 和 HTTP 两种协议(连接建立时自动识别)。验证方式任选其一:
redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello "world"也可以直接用浏览器打开http://localhost:6379,能出页面说明 HTTP 控制台是通的。写读都通,即可算部署成功。
如果习惯本地二进制而不是容器,需要先克隆源码再编译:
git clone https://gitcode.com/GitHub_Trending/dr/dragonfly构建细节以仓库内构建文档为准,编译产物就是dragonfly入口程序。
仓库目录速览
仓库按"核心源码 / 部署物料 / 文档 / 测试 / 工具"五块组织,速查表如下:
| 路径 | 作用 |
|---|---|
| src/ | 全部核心 C++ 源码。facade/是 RESP/Memcached 协议解析与应答层,server/是各命令族实现(字符串、哈希、事务、集群等),core/是 Dash 哈希表等基础数据结构,redis/内嵌了 Redis 的 dict/sds 等组件 |
| docs/ | 设计与行为文档:dashtable.md讲哈希表设计、cluster-mode.md讲集群、transaction.md讲事务、differences.md讲与 Redis 的差异,quick-start/是快速入门 |
| contrib/ | 部署物料:docker/提供 docker-compose 编排,charts/dragonfly/是 Kubernetes Helm Chart |
| tests/ | Python 集成测试(pytest),含集群、复制、TLS 等场景,还有 fakeredis 兼容层测试 |
| fuzz/ | 模糊测试种子与脚本,用于协议层健壮性验证 |
| tools/ | 运维辅助:cluster_mgr.py集群管理脚本、packaging/下的多发行版 Dockerfile 与 debian/rpm 打包脚本 |
CMakeLists.txt/Makefile | 构建入口,配合 CMake 完成编译 |
| CONTRIBUTING.md / LICENSE.md | 贡献流程与许可证(BSL 1.1,商用前留意条款) |
想读源码时,建议从src/server/dfly_main.cc入手,它负责解析运行参数并拉起整个服务。
关键配置解读
Dragonfly 的运行参数走的是"命令行 flag"体系,没有传统redis.conf那样的配置文件。参数有三种给法,任选其一:
- 命令行:
./dragonfly --port=6379 --bind=localhost - flag 文件:
--flagfile <filename>,每行一个 flag,键值用等号连接,值不加引号 - 环境变量:
DFLY_x(x为 flag 原名,大小写敏感)
只挑日常真正会动的几项,其余跑dragonfly --help查:
| 配置项 | 默认值 | 说明 |
|---|---|---|
port | 6379 | RESP 协议监听端口,可改成6380等避让已有 Redis |
bind | 不限 | 设localhost只收本机连接;设0.0.0.0放开全部 IPv4 |
requirepass | "" | AUTH 密码。空值 = 无认证,生产环境务必设置 |
maxmemory | 0 | 内存上限,人类可读格式如4gb;0表示程序自动判定 |
dbfilename | dump | 快照文件名,例如dump.rdb |
dir | ""(CLI) | 快照保存目录;Docker 镜像默认是/data,可用-v映射到宿主机 |
cache_mode | 关 | 开启后启用自适应淘汰,逼近maxmemory才驱逐冷数据 |
hz | 100 | 过期键评估频率,调低省 CPU,代价是过期键清理变慢 |
memcached_port | 禁用 | 在该端口额外提供 Memcached 协议,双协议并存 |
keys_output_limit | 8192 | keys命令返回上限,防止大键空间下内存暴涨 |
snapshot_cron | "" | 定时快照,标准 cron 语法,如0 6 * * *每天 6 点 |
dbnum | — | 支持select的数据库数量上限 |
一条包含常用项的启动示例(示例值可按需替换):
./dragonfly --bind=localhost --port=6379 --requirepass=pass123 \ --cache_mode=true --maxmemory=12gb --dbfilename=dump.rdb --logtostderr⚠️ 一个容易踩的坑:主端口默认开着 HTTP 控制台(primary_port_http_enabled默认true)。如果你要把 6379 暴露到不受信网络,先加--nohttp_admin_console关掉它,或者单独开admin_port做管理访问。
下一步:文档、测试与进阶方向
- 行为差异:迁移前通读 differences.md,重点看过期时间的精度约定(超过 2^28 ms 的毫秒级过期会被舍入到秒)等与 Redis 不一致的细节。
- 原理解析:想理解性能从哪来,看 dashtable.md(哈希表设计)、df-share-nothing.md(shared-nothing 架构)和 transaction.md(基于 VLL 论文的无锁事务)。
- 集群与复制:读 cluster-mode.md 了解
cluster_mode=emulated的模拟集群能力;tests/dragonfly/下的复制、迁移相关 pytest 是很好的行为参照。 - 部署形态:单机之外的两种方式都放在仓库里——docker-compose 编排 和 Helm Chart,K8s 生产部署建议直接用后者。
- 贡献与反馈:命令缺失或行为异常,按 CONTRIBUTING.md 提 issue;
fuzz/目录也欢迎补充模糊测试种子。
配置项与默认值可能随版本变化,以dragonfly --help和官方文档为准。
【免费下载链接】dragonflyA modern replacement for Redis and Memcached项目地址: https://gitcode.com/GitHub_Trending/dr/dragonfly
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考