最近我们server在重构,其中发现了不少坑。
首先我们的好多数据都会缓存在redis中。官方并没有C++ Client,所以为了方便维护代码,在C的API上封装一个C++ Client。
其中碰到的第一坑是,我们有一些数据是直接将Protobuf的二进制直接存入Redis,最初没发现什么,只是单纯的通过strlen
来计算最终要传入的c 字符串长度,由于strlen
计算长度的原理只是碰到第一个'\0'
就结束,而我们的protobuf的二进制数据中并不应该因此作为结尾符。所以因将上层的std::string的length保存了,在这里传入std::string的length值。
本以为相关的坑到此为止。直到我们需要使用pipeline。天呐!发现redis c api只让你传一个char*进去并不能传没有长度啊!!!由于下游都在使用,要推动不直接使用二进制很困难,所以就被Block了。。
无意中想到,其实很简答,设置API的时候多增加一套API,在传值的时候将二进制Base64一下,取的时候再Decode一下就OK了。如果对性能不敏感,可以所有API都这么干,如果敏感的话,就设置一个标志位,当标志位被置为True的情况下才做如此操作。毕竟在我们的Case中,我们是知道哪些场景中数据是二进制。写代码的时候就能作为区分。