2021-12-20 17:42:55 +08:00
# Dragonfly
2021-11-24 20:17:44 +08:00
2022-05-11 17:48:53 +08:00
[![ci-tests ](https://github.com/dragonflydb/dragonfly/actions/workflows/ci.yml/badge.svg )](https://github.com/dragonflydb/dragonfly/actions/workflows/ci.yml)
2021-12-21 17:07:29 +08:00
2022-03-03 15:34:53 +08:00
A novel memory store that supports Redis and Memcached commands.
For more detailed status of what's implemented - see below.
2021-11-24 20:17:44 +08:00
2022-03-03 15:34:53 +08:00
Features include:
2021-11-30 16:11:59 +08:00
1. High throughput reaching millions of QPS on a single node.
2. TLS support.
3. Pipelining mode.
2022-03-03 15:34:53 +08:00
4. A novel cache design, which does not require specifying eviction policies.
5. Memory efficiency that can save 20-40% for regular workloads and even more for cache like
workloads
2021-11-30 16:11:59 +08:00
2022-05-11 17:48:53 +08:00
## Running
dragonfly requires Linux OS version 5.11 or later.
Ubuntu 20.04.4 or 22.04 fit these requirements.
If built locally just run:
2021-11-30 16:11:59 +08:00
2022-05-12 01:37:25 +08:00
```bash
2022-05-11 17:48:53 +08:00
./dragonfly --logtostderr
2022-05-12 01:37:25 +08:00
2022-03-24 17:30:22 +08:00
```
2021-11-30 16:11:59 +08:00
2022-05-11 17:48:53 +08:00
or with docker:
2022-05-12 01:37:25 +08:00
```bash
docker pull ghcr.io/dragonflydb/dragonfly:latest & & \
docker tag ghcr.io/dragonflydb/dragonfly:latest dragonfly
2021-11-30 16:11:59 +08:00
2022-05-11 17:48:53 +08:00
docker run --network=host --rm dragonfly
2021-11-30 16:11:59 +08:00
```
2022-05-11 17:48:53 +08:00
Some systems may require adding `--ulimit memlock=-1` to `docker run` options.
We support redis command arguments where applicable.
For example, you can run: `docker run --network=host --rm dragonfly --requirepass=foo --bind localhost` .
dragonfly currently supports the following commandline options:
2022-05-12 01:37:25 +08:00
* `port`
* `bind`
* `requirepass`
* `maxmemory`
* `memcache_port` - to enable memcached compatible API on this port. Disabled by default.
* `dir` - by default, dragonfly docker uses `/data` folder for snapshotting. You can use `-v` docker option to map it to your host folder.
* `dbfilename`
* `dbnum` - maximum number of supported databases for `select` .
* `keys_output_limit` - maximum number of returned keys in `keys` command. Default is 8192.
We truncate the output to avoid blowup in memory when fetching too many keys.
2022-05-11 17:48:53 +08:00
for more options like logs management or tls support, run `dragonfly --help` .
## Building from source
I've tested the build on Ubuntu 20.04+.
Requires: CMake, Ninja, boost, libunwind8-dev
2021-11-30 16:11:59 +08:00
2022-05-12 01:37:25 +08:00
```bash
2022-05-11 17:48:53 +08:00
# to install dependencies
sudo apt install ninja-build libunwind-dev libboost-fiber-dev libssl-dev
git clone --recursive https://github.com/dragonflydb/dragonfly & & cd dragonfly
# another way to install dependencies
./helio/install-dependencies.sh
# Configure the build
./helio/blaze.sh -release
cd build-opt & & ninja dragonfly # build
2021-11-30 16:11:59 +08:00
```
2022-05-11 17:48:53 +08:00
## Roadmap and milestones
We are planning to implement most of the APIs 1.x and 2.8 (except the replication) before we release the project to source availability on github. In addition, we will support efficient expiry (TTL) and cache eviction algorithms.
2022-01-09 01:39:30 +08:00
2022-05-12 01:37:25 +08:00
The next milestone afterwards will be implementing `redis -> dragonfly` and
2022-05-11 17:48:53 +08:00
`dragonfly<->dragonfly` replication.
2022-05-12 01:37:25 +08:00
For dragonfly-native replication we are planning to design a distributed log format that will support order of magnitude higher speeds when replicating.
2022-05-11 17:48:53 +08:00
Commands that I wish to implement after releasing the initial code:
- PUNSUBSCRIBE
- PSUBSCRIBE
- HYPERLOGLOG
- SCRIPT DEBUG
- OBJECT
- DUMP/RESTORE
- CLIENT
Their priority will be determined based on the requests from the community.
Also, I will omit keyspace notifications. For that I would like to deep dive and learn
exact the exact needs for this API.
### Milestone - "Source Available"
2022-01-09 01:39:30 +08:00
API 1.0
- [X] String family
- [X] SET
- [ ] SETNX
- [X] GET
2022-01-24 14:49:38 +08:00
- [X] DECR
- [X] INCR
- [X] DECRBY
2022-01-10 02:43:49 +08:00
- [X] GETSET
2022-01-24 14:49:38 +08:00
- [X] INCRBY
2022-01-09 01:39:30 +08:00
- [X] MGET
- [X] MSET
2022-04-02 01:43:56 +08:00
- [X] MSETNX
- [X] SUBSTR
2022-01-09 01:39:30 +08:00
- [ ] Generic family
- [X] DEL
- [X] ECHO
- [X] EXISTS
- [X] EXPIRE
2022-01-10 02:43:49 +08:00
- [X] EXPIREAT
2022-04-19 16:38:23 +08:00
- [X] KEYS
2022-01-24 14:49:38 +08:00
- [X] PING
2022-01-09 01:39:30 +08:00
- [X] RENAME
- [X] RENAMENX
- [X] SELECT
2022-01-10 02:43:49 +08:00
- [X] TTL
2022-01-24 14:49:38 +08:00
- [X] TYPE
2022-01-09 01:39:30 +08:00
- [ ] SORT
- [X] Server Family
2022-04-19 16:38:23 +08:00
- [X] AUTH
2022-01-09 01:39:30 +08:00
- [X] QUIT
- [X] DBSIZE
- [ ] BGSAVE
2022-01-24 14:49:38 +08:00
- [X] SAVE
2022-01-10 02:43:49 +08:00
- [X] DEBUG
- [X] EXEC
2022-01-30 03:02:31 +08:00
- [X] FLUSHALL
2022-01-10 02:43:49 +08:00
- [X] FLUSHDB
2022-01-24 14:49:38 +08:00
- [X] INFO
2022-01-10 02:43:49 +08:00
- [X] MULTI
- [X] SHUTDOWN
2022-01-24 14:49:38 +08:00
- [X] LASTSAVE
2022-01-30 03:02:31 +08:00
- [X] SLAVEOF/REPLICAOF
2022-01-09 01:39:30 +08:00
- [ ] SYNC
- [ ] Set Family
2022-02-28 04:44:22 +08:00
- [x] SADD
- [x] SCARD
- [X] SDIFF
- [X] SDIFFSTORE
- [X] SINTER
- [X] SINTERSTORE
- [X] SISMEMBER
- [X] SMOVE
- [X] SPOP
2022-01-09 01:39:30 +08:00
- [ ] SRANDMEMBER
2022-02-28 04:44:22 +08:00
- [X] SREM
- [X] SMEMBERS
- [X] SUNION
- [X] SUNIONSTORE
2022-01-09 01:39:30 +08:00
- [X] List Family
- [X] LINDEX
- [X] LLEN
- [X] LPOP
- [X] LPUSH
2022-03-16 01:52:11 +08:00
- [X] LRANGE
- [X] LREM
- [X] LSET
- [X] LTRIM
2022-01-09 01:39:30 +08:00
- [X] RPOP
2022-04-29 12:16:32 +08:00
- [X] RPOPLPUSH
2022-01-09 01:39:30 +08:00
- [X] RPUSH
2022-03-06 14:46:48 +08:00
- [X] SortedSet Family
- [X] ZADD
- [X] ZCARD
2022-03-30 19:25:42 +08:00
- [X] ZINCRBY
2022-03-18 11:12:22 +08:00
- [X] ZRANGE
- [X] ZRANGEBYSCORE
2022-03-06 14:46:48 +08:00
- [X] ZREM
2022-03-23 05:50:47 +08:00
- [X] ZREMRANGEBYSCORE
2022-03-24 02:45:19 +08:00
- [X] ZREVRANGE
2022-03-06 14:46:48 +08:00
- [X] ZSCORE
2022-01-09 01:39:30 +08:00
- [ ] Not sure whether these are required for the initial release.
- [ ] BGREWRITEAOF
- [ ] MONITOR
- [ ] RANDOMKEY
- [ ] MOVE
API 2.0
2022-04-04 17:07:27 +08:00
- [X] List Family
2022-01-24 14:49:38 +08:00
- [X] BLPOP
2022-03-31 19:26:33 +08:00
- [X] BRPOP
2022-01-09 01:39:30 +08:00
- [ ] BRPOPLPUSH
2022-04-19 00:45:48 +08:00
- [X] LINSERT
2022-03-25 05:04:02 +08:00
- [X] LPUSHX
- [X] RPUSHX
2022-03-08 05:11:43 +08:00
- [X] String Family
- [X] SETEX
2022-03-23 23:54:25 +08:00
- [X] APPEND
- [X] PREPEND (dragonfly specific)
- [ ] BITCOUNT
- [ ] BITFIELD
- [ ] BITOP
- [ ] BITPOS
- [ ] GETBIT
2022-03-25 05:04:02 +08:00
- [X] GETRANGE
2022-04-19 00:45:48 +08:00
- [X] INCRBYFLOAT
2022-03-27 01:06:46 +08:00
- [X] PSETEX
2022-03-23 23:54:25 +08:00
- [ ] SETBIT
2022-03-27 01:06:46 +08:00
- [X] SETRANGE
2022-03-25 05:04:02 +08:00
- [X] STRLEN
2022-03-03 15:34:53 +08:00
- [X] HashSet Family
- [X] HSET
2022-03-08 05:00:18 +08:00
- [X] HMSET
2022-03-03 15:34:53 +08:00
- [X] HDEL
- [X] HEXISTS
- [X] HGET
2022-03-08 05:00:18 +08:00
- [X] HMGET
2022-03-03 15:34:53 +08:00
- [X] HLEN
2022-04-02 16:03:35 +08:00
- [X] HINCRBY
2022-04-20 03:21:54 +08:00
- [X] HINCRBYFLOAT
2022-03-08 05:00:18 +08:00
- [X] HGETALL
2022-03-04 20:06:48 +08:00
- [X] HKEYS
2022-04-02 16:03:35 +08:00
- [X] HSETNX
- [X] HVALS
2022-04-20 03:21:54 +08:00
- [X] HSCAN
2022-01-09 01:39:30 +08:00
- [ ] PubSub family
2022-03-30 19:25:42 +08:00
- [X] PUBLISH
2022-01-09 01:39:30 +08:00
- [ ] PUBSUB
- [ ] PUBSUB CHANNELS
2022-03-30 19:25:42 +08:00
- [X] SUBSCRIBE
- [X] UNSUBSCRIBE
2022-04-01 15:12:32 +08:00
- [ ] PSUBSCRIBE
- [ ] PUNSUBSCRIBE
- [ ] Server Family
2022-01-09 01:39:30 +08:00
- [ ] WATCH
- [ ] UNWATCH
2022-03-31 19:26:33 +08:00
- [X] DISCARD
2022-05-10 11:35:37 +08:00
- [X] CLIENT LIST/SETNAME
- [ ] CLIENT KILL/UNPAUSE/PAUSE/GETNAME/REPLY/TRACKINGINFO
2022-03-23 23:54:25 +08:00
- [X] COMMAND
2022-04-22 04:26:29 +08:00
- [X] COMMAND COUNT
- [ ] COMMAND GETKEYS/INFO
2022-03-23 23:54:25 +08:00
- [ ] CONFIG GET/REWRITE/SET/RESETSTAT
- [ ] MIGRATE
- [ ] ROLE
- [ ] SLOWLOG
- [ ] PSYNC
- [ ] TIME
- [ ] LATENCY...
2022-01-24 14:49:38 +08:00
- [X] Generic Family
- [X] SCAN
2022-03-13 03:51:35 +08:00
- [X] PEXPIREAT
2022-03-23 23:54:25 +08:00
- [ ] PEXPIRE
- [ ] DUMP
- [X] EVAL
- [X] EVALSHA
- [ ] OBJECT
- [ ] PERSIST
2022-03-25 05:04:02 +08:00
- [X] PTTL
2022-03-23 23:54:25 +08:00
- [ ] RESTORE
2022-04-30 21:58:36 +08:00
- [X] SCRIPT LOAD/EXISTS
- [ ] SCRIPT DEBUG/KILL/FLUSH
2022-03-23 23:54:25 +08:00
- [X] Set Family
- [X] SSCAN
- [X] Sorted Set Family
2022-04-07 03:54:10 +08:00
- [X] ZCOUNT
2022-05-11 02:48:24 +08:00
- [X] ZINTERSTORE
2022-04-21 02:50:29 +08:00
- [X] ZLEXCOUNT
- [X] ZRANGEBYLEX
2022-04-07 03:54:10 +08:00
- [X] ZRANK
2022-04-21 04:51:48 +08:00
- [X] ZREMRANGEBYLEX
2022-03-24 02:45:19 +08:00
- [X] ZREMRANGEBYRANK
2022-04-21 04:51:48 +08:00
- [X] ZREVRANGEBYSCORE
2022-04-07 03:54:10 +08:00
- [X] ZREVRANK
2022-05-11 02:48:24 +08:00
- [X] ZUNIONSTORE
2022-04-29 12:16:32 +08:00
- [X] ZSCAN
2022-03-23 23:54:25 +08:00
- [ ] HYPERLOGLOG Family
- [ ] PFADD
- [ ] PFCOUNT
- [ ] PFMERGE
2022-01-09 01:39:30 +08:00
2022-05-11 17:48:53 +08:00
Memchache API
2022-04-04 17:07:27 +08:00
- [X] set
- [X] get
- [X] replace
- [X] add
- [X] stats (partial)
- [x] append
- [x] prepend
- [x] delete
- [x] flush_all
- [x] incr
- [x] decr
- [x] version
- [x] quit
2022-05-11 17:48:53 +08:00
Random commands we implemented as decorators along the way:
2022-04-04 17:07:27 +08:00
2022-05-11 17:48:53 +08:00
- [X] ROLE (2.8) decorator for for master without replicas
2022-02-28 23:36:45 +08:00
- [X] UNLINK (4.0) decorator for DEL command
2022-05-11 17:48:53 +08:00
- [X] BGSAVE (decorator for save)
- [X] FUNCTION FLUSH (does nothing)
2022-03-06 03:35:49 +08:00
2022-05-11 17:48:53 +08:00
## Milestone "Stability"
2022-04-04 17:07:27 +08:00
APIs 3,4,5 without cluster support, without modules, without memory introspection commands.
Without geo commands and without support for keyspace notifications, without streams.
Design config support. ~10-20 commands overall...
Probably implement cluster-API decorators to allow cluster-configured clients to connect to a single
instance.
2022-03-06 03:35:49 +08:00
2022-04-05 13:36:00 +08:00
- [X] HSTRLEN
2022-03-06 03:35:49 +08:00
## Design decisions along the way
2022-05-11 17:48:53 +08:00
2022-05-17 00:39:13 +08:00
### Novel cache design
Redis allows choosing 8 different eviction policies using `maxmemory-policy` flag.
Dragonfly has one unified adaptive caching algorithm that is more memory efficient
than of Redis. You can enable caching mode by passing `--cache_mode=true` flag. Once this mode is on, Dragonfly will evict items when it reaches maxmemory limit.
2022-03-06 03:35:49 +08:00
### Expiration deadlines with relative accuracy
2022-04-13 15:50:19 +08:00
Expiration ranges are limited to ~4 years. Moreover, expiration deadlines
2022-03-06 03:35:49 +08:00
with millisecond precision (PEXPIRE/PSETEX etc) will be rounded to closest second
2022-04-13 15:50:19 +08:00
**for deadlines greater than 134217727ms (approximately 37 hours)**.
Such rounding has less than 0.001% error which I hope is acceptable for large ranges.
2022-03-24 17:30:22 +08:00
If it breaks your use-cases - talk to me or open an issue and explain your case.
2022-04-04 17:07:27 +08:00
2022-05-17 00:39:13 +08:00
For more detailed differences between this and Redis implementations [see here ](doc/differences.md ).
### Native Http console and Prometheus compatible metrics
By default Dragonfly also allows http access on its main TCP port (6379). That's right, you
can use for Redis protocol and for HTTP protocol - type of protocol is determined automatically
during the connection initiation. Go ahead and try it with your browser.
Right now it does not have much info but in the future we are planning to add there useful
debugging and management info. If you go to `:6379/metrics` url you will see some prometheus
compatible metrics.
Important! Http console is meant to be accessed within a safe network. If you expose Dragonfly's TCP port externally, it is advised to disable the console with `--http_admin_console=false` or `--nohttp_admin_console` .