arana-db / kiwi

a high-performance, large-capacity, multi-tenant, data-persistent, strong data consistency based on raft, Redis-compatible elastic KV data storage system based on RocksDB
BSD 3-Clause "New" or "Revised" License
11 stars 7 forks source link

command develop tasks #12

Open panlei-coder opened 1 month ago

panlei-coder commented 1 month ago

pikiwidb 命令处理相关功能的开发

在pikiwidb中, 每一个命令处理对应一个C++的class, 当服务端收到一条命令时,会去找这个命令处理对应的对象, 如果没有找到返回错误, 如果找到后, 执行对应的命令.

函数入口(这是临时处理函数,后面会调整这个函数的实现) https://github.com/OpenAtomFoundation/pikiwidb/blob/e05878dfe99c232be3a6f40b6dc9ab73785c7db0/src/client.cc#L244

命令处理相关代码

BaseCmd 是所有命令处理类的基类, https://github.com/OpenAtomFoundation/pikiwidb/blob/e05878dfe99c232be3a6f40b6dc9ab73785c7db0/src/base_cmd.h#L89

所有命令处理的class需要继承这个类, 并且重写 DoInitialDoCmd 这两个虚函数.

DoInitial 函数, 在命令执行前调用, 负责处理命令执行需要的参数, 例如把 命令的key找到, 命令参数的大小写转换等等 DoCmd 函数, 命令执行时的逻辑处理函数, 负责整个命令的具体处理逻辑

需要在 构造函数中,给 BaseCmdflag 赋值, flag值根据实际情况确定, 例子:https://github.com/OpenAtomFoundation/pikiwidb/blob/e05878dfe99c232be3a6f40b6dc9ab73785c7db0/src/cmd_kv.cc#L13

命令分类

命令分为两大类

命令注册

所有的命令需要把命令对象的指针注册(写入)到 commandManager 这个map中, map的 key 是 命令名, value 是处理这个命令的指针

命令注册函数 https://github.com/OpenAtomFoundation/pikiwidb/blob/e05878dfe99c232be3a6f40b6dc9ab73785c7db0/src/cmd_table_manager.cc#L20

代码文件

代码文件, 每个类型的命令有一个单独的文件, 并且命令处理相关的文件以 cmd 开头, 例如 STRING 相关的命令, 文件名cmd_kv.cccmd_kv.h, HASH 相关的命令 cmd_hash.cc, cmd_hash.h

实现步骤

string:

get done set done strlen done mset done setnx done setex done psetex done getset done mget done append done bitcount done bitop done getbit done setbit done incr done decr done incrby done incrbyfloat done decrby done getrange done setrange done msetnx done

hashtable

ncy: hlen over hstrlen over hset over hget over hgetall over hmset over hmget over hkeys over hrandfield over hscan over

csx: hsetnx done hincrby done

pcy: hincrbyfloat done hvals over

qxh: hdel over

ncy: hexists done

set:

whr: sadd over scard done

cwl: sismember over

crp:
srem over srandmember done

whr: smembers done sdiff done sdiffstore done

cwl: sinter done sinterstore done sscan done

Henry: sunion over sunionstore over

pcy: smove done spop done

list:

cwl: lpush done rpush done

liuhuan: lpushx done rpushx done lpop done lindex done llen done

csq: rpop done

cwl: lset done ltrim done lrange done linsert done

henry: lrem done

lh: blpop brpop rpoplpush 从 Redis 6.2.0起, RPOPLPUSH 被废弃,使用 LMOVE 替代 brpoplpush 从 Redis 6.2.0 起,建议使用 BLMOVE 替代 BRPOPLPUSH

zset done

whr: zcard done

pl: zrank done zrevrank done zrem done zincrby done

wxr: zadd done zrevrange done zrangebyscore done

csx: zrevrangebyscore done zremrangebyrank done
zrangebylex done zrevrangebylex done zscore done zrange done zremrangebyscore done

key:

henry: exists done del done

lft: type done expire done ttl done

cwl: pexpire done pttl done expireat done pexpireat done

lh: persist done keys done

// admin

select done

dingxiaoshuai config done

panlei: scan

pcy flushdb done flushall done

renzhenfeng(0629): dbsize pr bgsave pr

lh: save 实现成本比较高 lastsave 实现成本比较高

tangruilin: echo pr auth pr

bzm: shutdown done

smj info pr

zzl: rename done renamenx done

zhy: 2024.6.15 sort done

gkj: 2024.6.15 client pr monitor pr

optics: debug done

ping done

todo: randomkey move:涉及多 db 的时候,保证一致性比较难,暂时不做 hello mxr slowlog zrk

panlei-coder commented 1 month ago

宁常远:写了个小工具用于对比 pikiwidb 与 redis 输出,在实现命令时可以用来与 redis 对比。 代码放在我 fork 的仓库了:https://github.com/longfar-ncy/pikiwidb/tree/feat/pr-cli/tool/pr-cli 效果如图: image image

panlei-coder commented 1 month ago

image

美团 KV 系统 RTC 优化

from https://tech.meituan.com/2024/03/15/kv-squirrel-cellar.html

总流程: 1 Pikiwidb 将是内存和磁盘混合存储模型 2 线程模型分为网络线程池和 worker 线程池 3 网络线程池处理客户端连接请求,和对内存的读请求 4 worker 线程池处理磁盘读写任务 以及对内存的写任务