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)
2021-12-20 17:42:55 +08:00
A toy memory store that supports basic commands like `SET` and `GET` for both memcached and redis protocols. In addition, it supports redis `PING` command.
2021-11-24 20:17:44 +08:00
Demo 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.
## Building from source
I've tested the build on Ubuntu 21.04+.
```
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
- [ ] LRANGE
- [ ] LREM
- [ ] LSET
- [ ] LTRIM
- [X] RPOP
- [ ] RPOPLPUSH
- [X] RPUSH
- [ ] SortedSet Family
- [ ] ZADD
- [ ] ZCARD
- [ ] ZINCRBY
- [ ] ZRANGE
- [ ] ZRANGEBYSCORE
- [ ] ZREM
- [ ] ZREMRANGEBYSCORE
- [ ] ZREVRANGE
- [ ] ZSCORE
- [ ] 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-02-22 19:23:35 +08:00
- [ ] 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-01-09 01:39:30 +08:00
- [ ] BRPOP
- [ ] BRPOPLPUSH
- [ ] PubSub family
- [ ] PUBLISH
- [ ] PUBSUB
- [ ] PUBSUB CHANNELS
- [ ] SUBSCRIBE
- [ ] UNSUBSCRIBE
- [ ] Server Family
- [ ] WATCH
- [ ] UNWATCH
- [ ] DISCARD
2022-01-24 14:49:38 +08:00
- [X] Generic Family
- [X] SCAN
2022-02-22 19:23:35 +08:00
- [X] String Family
- [X] APPEND
- [X] PREPEND (dragonfly specific)
2022-01-24 14:49:38 +08:00
2022-01-09 01:39:30 +08:00
2022-01-10 02:43:49 +08:00
Commands that I prefer not implement before launch:
- [ ] PUNSUBSCRIBE
- [ ] PSUBSCRIBE
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
## 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-01-09 02:36:52 +08:00
TBD.