背景
网上划水时遇到了使用 Go 编写的另一个 Redis, 名为 DiceDB 。当时发现该数据库除了 go sdk 之外,并没有提供其他语言的,于是自己参考 reids-py 等库,发布了第一个版本dicedb 。这个版本很多功能是缺失的,比如 Connection Pool, 异步等。该数据库是使用 Protocol Buffers 作为数据序列化协议的,昨天突然注意到所编写的 pb 进行了变更,于是为了与最新版本保持一致,也更新了相关的代码。
具体问题
DiceDB 对于请求命令的数据定义如下:
message Command {
string cmd = 1; // 具体的命令,比如 GET, SET...
repeated string args = 2; // 命令参数
}
因 args 字段定义为 string, 所以在执行命令(或发送命令请求)时需将参数转化为字符串。对 GET 查询命令的返回的数据定义
message GETRes {
string value = 1;
}
返回的数据字段 value 为 string 类型,那么我从 tcp 读取字节流,转换成 GETRes 类型的数据时,value 会被转换成 python 中的 str 数据类型 。而我的提供的 get 操作代码实列如下:
from dicedb import Dice
dice = Dice('localhost', 7379)
dice.set('k', 43)
dice.decr('k')
k = dice.get('k')
...
对于 set,decr 暂时不关注其返回的数据,在上面代码最后一行中, k 的结果会是字符串数字 '43', 但上面用户直接提供了字符串数字 43 。所以,我需要在库内部完成类型的转换还是丢给用户去处理这种情况?
def get(key, t: Optional[Type[T]] = str) -> T:
...
那你这里的设计和上游保持一致就行了,def get(key: str) -> Optional[str]。如果真需要转型,可以加一个命名参数:
>All responses are returned as bytes in Python. To receive decoded strings, set decode_responses=True.
也就是说把选择空间留给用户。