协议定义与实现, 协议支持 批处理、特殊字符如\r\n\0。与单条命令测试。
/** * Header: | magic(4) | payloadLen(4) | * * Request * Payload: | opcount(4) | repeat Cmd | * Cmd: | OP(1) | argc(4) | repeat Arg | * Arg: | arglen(4) | arg | * * Response * Payload: | opcount(4) | repeat Rsp | * Rsp: | OP(1) | status(1) | datalen(4) | data | */ kvstore层,先解析,再执行,最后构建返回体。 一个是半包问题,没有处理。 另一个是感觉协议结构有点麻烦,
This commit is contained in:
33
README.md
33
README.md
@@ -1,5 +1,38 @@
|
||||
# 9.1 Kvstore
|
||||
|
||||
#### 目前KV存储没有持久化,down 之后 就清空。
|
||||
1. 全量持久化。
|
||||
save() -> 全保存数据集。
|
||||
2. 增量持久化。
|
||||
每执行一条,把命令写入文件里。下次允许把日志重新运行。
|
||||
|
||||
#### 目前KV存储 key value 都是调用的 malloc, 都是系统的内存分配。
|
||||
1. 会出现大量的内存碎片,实现一个内存池,管理内存数据。
|
||||
2. 对比有内存池和没有内存池的性能差异,以及开源内存池 jemalloc 的性能差别。
|
||||
3. 性能测:
|
||||
1. qps 有没有内存池。
|
||||
2.虚拟内存的占用情况 htop。插入百万条数据集(KV*100w,set 200w del 100w delete 200w set 100w)。
|
||||
|
||||
#### 目前的kv存储是单指令的,一条指令一交互。
|
||||
从单挑指令实现批量处理。
|
||||
|
||||
对于同一个连接,目前缺少对以下情况的处理:
|
||||
1. 收到半包
|
||||
2. 收到多条消息
|
||||
|
||||
对不同连接,隔离他们的消息到不同的缓冲区?要不先不考虑不同的连接的情况?Nytoco代码不是很熟。
|
||||
|
||||
如果read->execute->send->read同步循环,不会出现缓冲区被覆盖的情况。但是可能会有半包或者两个命令都抵达了,才触发事件。所以应用层需要解析到完整请求才执行下一步。
|
||||
|
||||
|
||||
#### 目前KV存储是一个单点服务,实现一个主从同步的功能。
|
||||
主从同步:启动两个KVstore。在a里set,在b里get。
|
||||
|
||||
#### 目前的Key和Value都是单个单词的,实现支持特殊字符。
|
||||
如:空格回车换行。支持插入博客。
|
||||
|
||||
这里需要在协议中定义消息长度而不是特殊字符做分隔来确定哪些数据是key哪些是value。
|
||||
|
||||
|
||||
### 面试题
|
||||
1. 为什么会实现kvstore,使用场景在哪里?
|
||||
|
||||
Reference in New Issue
Block a user