C++20 实现的增强版 Redis 服务器,使用 RocksDB 作为持久化存储引擎。(集群支持尚正在计划中)
- Linux 或 MAC OS 或 FreeBSD
# Rocky Linux, Fedora Linux, CentOS
sudo dnf groupinstall -y 'Development Tools'
sudo dnf install cmake g++ autoconf perl -y
git config --global http.version HTTP/1.1
# Ubuntu
sudo apt install cmake g++ autoconf perl -y
git config --global http.version HTTP/1.1
执行以下命令开始编译 Kiwi:
./etc/script/build.sh
Kiwi 默认以 release 模式编译,不支持调试。如果需要调试,请以 debug 模式编译。
./etc/script/build.sh --clear
./etc/script/build.sh --debug
./bin/kiwi ./etc/conf/Kiwi.conf
你可以用 Redis 的各种工具来测试 Kiwi,比如官方的 redis-cli, redis-benchmark。
Kiwi 可以和 Redis 之间进行复制,可以读取 Redis 的 rdb 文件或 aof 文件。当然,Kiwi 生成的 aof 或 rdb 文件也可以被 Redis 读取。
你还可以用 redis-sentinel 来实现 Kiwi 的高可用!
总之,Kiwi 与 Redis 完全兼容。
- Kiwi 性能大约比 Redis 3.2 高出 20% (使用 redis-benchmark 测试 pipeline 请求,比如设置 -P=50 或更高)
- Kiwi 的高性能有一部分得益于独立的网络线程处理 IO,因此和 redis 比占了便宜。但 Kiwi 逻辑仍然是单线程的。
- 另一部分得益于 C++ STL 的高效率(CLANG 的表现比 GCC 更好)。
- 在测试前,你要确保 std::list 的 size() 是 O(1) 复杂度,这才遵循 C++11 的标准。否则 list 相关命令不可测。
运行下面这个命令,试试和 redis 比一比~
./redis-benchmark -q -n 1000000 -P 50 -c 50
是的,在内存受限的情况下,你可以让 Kiwi 根据简单的 LRU 算法淘汰一些 key 以释放内存。
这些特性 Kiwi 都有:-)
RocksDB 可以配置为 Kiwi 的持久化存储引擎,可以存储更多的数据。
- cmdlist
- type exists del expire pexpire expireat pexpireat ttl pttl persist move keys randomkey rename renamenx scan sort
- select dbsize bgsave save lastsave flushdb flushall client debug shutdown bgrewriteaof ping echo info monitor auth
- set get getrange setrange getset append bitcount bitop getbit setbit incr incrby incrbyfloat decr decrby mget mset msetnx setnx setex psetex strlen
- lpush rpush lpushx rpushx lpop rpop lindex llen lset ltrim lrange linsert lrem rpoplpush blpop brpop brpoplpush
- hget hmget hgetall hset hsetnx hmset hlen hexists hkeys hvals hdel hincrby hincrbyfloat hscan hstrlen
- sadd scard srem sismember smembers sdiff sdiffstore sinter sinterstore sunion sunionstore smove spop srandmember sscan
- zadd zcard zrank zrevrank zrem zincrby zscore zrange zrevrange zrangebyscore zrevrangebyscore zremrangebyrank zremrangebyscore zpopmin zpopmax zunionstore zinterstore
- subscribe unsubscribe publish psubscribe punsubscribe pubsub
- watch unwatch multi exec discard
- sync slaveof