2021-12-20 17:42:55 +08:00
|
|
|
# Dragonfly
|
2021-11-24 20:17:44 +08:00
|
|
|
|
2021-12-21 17:07:29 +08:00
|
|
|
[![ci-tests](https://github.com/romange/dragonfly/actions/workflows/ci.yml/badge.svg)](https://github.com/romange/dragonfly/actions/workflows/ci.yml)
|
|
|
|
|
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
|
|
|
|
|
|
|
## Building from source
|
|
|
|
I've tested the build on Ubuntu 21.04+.
|
2022-03-24 17:30:22 +08:00
|
|
|
Requires: CMake, Ninja, boost, libunwind8-dev
|
2021-11-30 16:11:59 +08:00
|
|
|
|
2022-03-24 17:30:22 +08:00
|
|
|
```
|
|
|
|
sudo apt install ninja-build
|
|
|
|
sudo apt install libunwind-dev
|
|
|
|
sudo apt-get install libboost-all-dev
|
|
|
|
```
|
2021-11-30 16:11:59 +08:00
|
|
|
|
|
|
|
```
|
2021-12-20 17:42:55 +08:00
|
|
|
git clone --recursive https://github.com/romange/dragonfly
|
|
|
|
cd dragonfly && ./helio/blaze.sh -release
|
|
|
|
cd build-opt && ninja dragonfly
|
2021-11-30 16:11:59 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
## Running
|
|
|
|
|
|
|
|
```
|
2021-12-20 17:42:55 +08:00
|
|
|
./dragonfly --logtostderr
|
2021-11-30 16:11:59 +08:00
|
|
|
```
|
|
|
|
|
2021-12-20 17:42:55 +08:00
|
|
|
for more options, run `./dragonfly --help`
|
2022-01-09 01:39:30 +08:00
|
|
|
|
|
|
|
## Milestone Egg 🥚
|
|
|
|
|
|
|
|
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
|
|
|
|
- [ ] MSETNX
|
|
|
|
- [ ] SUBSTR
|
|
|
|
- [ ] Generic family
|
|
|
|
- [X] DEL
|
|
|
|
- [X] ECHO
|
|
|
|
- [X] EXISTS
|
|
|
|
- [X] EXPIRE
|
2022-01-10 02:43:49 +08:00
|
|
|
- [X] EXPIREAT
|
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
|
|
|
|
- [X] QUIT
|
|
|
|
- [X] DBSIZE
|
|
|
|
- [ ] BGSAVE
|
2022-01-24 14:49:38 +08:00
|
|
|
- [X] SAVE
|
2022-01-10 02:43:49 +08:00
|
|
|
- [X] DBSIZE
|
|
|
|
- [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
|
|
|
|
- [ ] RPOPLPUSH
|
|
|
|
- [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.
|
2022-02-20 19:49:37 +08:00
|
|
|
- [X] AUTH
|
2022-01-09 01:39:30 +08:00
|
|
|
- [ ] BGREWRITEAOF
|
|
|
|
- [ ] KEYS
|
|
|
|
- [ ] MONITOR
|
|
|
|
- [ ] RANDOMKEY
|
|
|
|
- [ ] MOVE
|
|
|
|
|
|
|
|
In addition, we want to support efficient expiry (TTL) and cache eviction algorithms.
|
|
|
|
We should implement basic memory management support. For Master/Slave replication we should design
|
|
|
|
a distributed log format.
|
|
|
|
|
2022-02-20 19:49:37 +08:00
|
|
|
### Memchache API
|
2022-02-22 19:23:35 +08:00
|
|
|
- [X] set
|
|
|
|
- [X] get
|
|
|
|
- [X] replace
|
|
|
|
- [X] add
|
|
|
|
- [X] stats (partial)
|
|
|
|
- [x] append
|
|
|
|
- [x] prepend
|
2022-02-28 00:04:38 +08:00
|
|
|
- [x] delete
|
2022-03-11 01:15:51 +08:00
|
|
|
- [x] flush_all
|
2022-02-24 05:54:56 +08:00
|
|
|
- [x] incr
|
|
|
|
- [x] decr
|
2022-02-28 00:04:38 +08:00
|
|
|
- [x] version
|
2022-02-24 05:54:56 +08:00
|
|
|
- [x] quit
|
2022-02-20 19:49:37 +08:00
|
|
|
|
2022-01-09 01:39:30 +08:00
|
|
|
API 2.0
|
|
|
|
- [ ] 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-03-23 23:54:25 +08:00
|
|
|
- [ ] BLMOVE
|
|
|
|
- [ ] 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-03-23 23:54:25 +08:00
|
|
|
- [ ] 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
|
|
|
|
- [ ] HINCRBY
|
|
|
|
- [ ] HINCRBYFLOAT
|
2022-03-08 05:00:18 +08:00
|
|
|
- [X] HGETALL
|
2022-03-04 20:06:48 +08:00
|
|
|
- [X] HKEYS
|
2022-03-23 23:54:25 +08:00
|
|
|
- [ ] HSETNX
|
|
|
|
- [ ] HVALS
|
|
|
|
- [ ] 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-03-23 23:54:25 +08:00
|
|
|
- [ ] CLIENT KILL/LIST/UNPAUSE/PAUSE/GETNAME/SETNAME/REPLY/TRACKINGINFO
|
|
|
|
- [X] COMMAND
|
|
|
|
- [ ] COMMAND COUNT/GETKEYS/INFO
|
|
|
|
- [ ] 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
|
|
|
|
- [X] SCRIPT LOAD
|
|
|
|
- [ ] SCRIPT DEBUG/KILL/FLUSH/EXISTS
|
|
|
|
- [X] Set Family
|
|
|
|
- [X] SSCAN
|
|
|
|
- [X] SMISMEMBER
|
|
|
|
- [X] Sorted Set Family
|
|
|
|
- [ ] ZCOUNT
|
|
|
|
- [ ] ZINTERSTORE
|
|
|
|
- [ ] ZLEXCOUNT
|
|
|
|
- [ ] ZRANGEBYLEX
|
|
|
|
- [ ] ZRANK
|
|
|
|
- [ ] ZREMRANGEBYLEX
|
2022-03-24 02:45:19 +08:00
|
|
|
- [X] ZREMRANGEBYRANK
|
2022-03-23 23:54:25 +08:00
|
|
|
- [ ] ZREVRANGEBYSCORE
|
|
|
|
- [ ] ZREVRANK
|
|
|
|
- [ ] ZUNIONSTORE
|
|
|
|
- [ ] ZSCAN
|
|
|
|
- [ ] HYPERLOGLOG Family
|
|
|
|
- [ ] PFADD
|
|
|
|
- [ ] PFCOUNT
|
|
|
|
- [ ] PFMERGE
|
2022-01-09 01:39:30 +08:00
|
|
|
|
2022-03-23 23:54:25 +08:00
|
|
|
Commands that I prefer avoid implementing before launch:
|
|
|
|
- PUNSUBSCRIBE
|
|
|
|
- PSUBSCRIBE
|
|
|
|
- HYPERLOGLOG
|
|
|
|
- SCRIPT DEBUG
|
|
|
|
- OBJECT
|
|
|
|
- DUMP/RESTORE
|
|
|
|
- CLIENT
|
2022-01-24 14:49:38 +08:00
|
|
|
|
|
|
|
Also, I would omit keyspace notifications. For that I would like to deep dive and learn
|
|
|
|
exact use-cases for this API.
|
2022-01-09 01:39:30 +08:00
|
|
|
|
2022-02-28 23:36:45 +08:00
|
|
|
### Random commands we implemented along the way
|
|
|
|
|
|
|
|
- [X] ROLE (2.8) decorator for for master withour replicas
|
|
|
|
- [X] UNLINK (4.0) decorator for DEL command
|
|
|
|
- [X] BGSAVE
|
2022-01-09 01:39:30 +08:00
|
|
|
## Milestone Nymph
|
2022-01-10 02:43:49 +08:00
|
|
|
API 2,3,4 without cluster support, without modules, without memory inspection commands.
|
2022-01-24 14:49:38 +08:00
|
|
|
Without support for keyspace notifications.
|
2022-01-10 02:43:49 +08:00
|
|
|
|
2022-01-09 02:36:52 +08:00
|
|
|
Design config support. ~140 commands overall...
|
2022-01-09 01:39:30 +08:00
|
|
|
## Milestone Molt
|
2022-01-09 02:36:52 +08:00
|
|
|
API 5,6 - without cluster and modules. Streams support. ~80 commands overall.
|
2022-01-09 01:39:30 +08:00
|
|
|
## Milestone Adult
|
2022-03-06 03:35:49 +08:00
|
|
|
TBD.
|
|
|
|
|
|
|
|
|
|
|
|
## Design decisions along the way
|
|
|
|
### Expiration deadlines with relative accuracy
|
2022-03-13 03:51:35 +08:00
|
|
|
I decided to limit the expiration range to 365 days. Moreover, expiration deadlines
|
2022-03-06 03:35:49 +08:00
|
|
|
with millisecond precision (PEXPIRE/PSETEX etc) will be rounded to closest second
|
2022-03-13 03:51:35 +08:00
|
|
|
**for deadlines greater than 33554431ms (approximately 560 minutes). In other words,
|
2022-03-06 03:35:49 +08:00
|
|
|
expiries of `PEXPIRE key 10010` will expire exactly after 10 seconds and 10ms. However,
|
2022-03-13 03:51:35 +08:00
|
|
|
`PEXPIRE key 34000300` will expire after 34000 seconds (i.e. 300ms earlier). Similarly,
|
|
|
|
`PEXPIRE key 34000800` will expire after 34001 seconds, i.e. 200ms later.
|
2022-03-06 03:35:49 +08:00
|
|
|
|
2022-03-13 03:51:35 +08:00
|
|
|
Such rounding has at most 0.002% 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.
|