我是靠谱客的博主 迷你月饼,最近开发中收集的这篇文章主要介绍坑爹的hiredis API使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

hiredis是redis的官方C API,但是不得不说API的使用很坑爹。


hiredis提供了一个名为redisCommand的API用于向redis server发送命令,redisCommand的函数原型如下:
void *redisCommand(redisContext *c, const char *format, ...)

貌似很牛逼的样子,提供了类似printf的可变参数机制。但这也正是本次爹被坑的地方。


比如,我有一个 “带有%字符的中文串”的 key 要去redis server查询value,我构造了redis 命令:
string cmd = "GET 100%坑爹的redisCommand "; 
并调用redisCommand如下:

redisCommand(c, cmd.c_str());


错误出现了,redisContext  c 的errstr 被置为 了 “out of memory”!很奇怪的错误。
通过查询hiredis的代码发现,redisCommand会调用它自己实现的一个坑爹的redisvFormatCommand函数:
int redisvFormatCommand(char **target, const char *format, va_list ap)

该函数实现中,当发现%的时候,会检查%后一个字符的合法性,如果不合法,就直接报错!


那么好吧,劳资不这么用好了吧?
string cmd = "GET 100%坑爹的redisCommand "; 
redisCommand(c, "%s", cmd.c_str());
嗯嗯,貌似好使了?错!从redis server 返回的结果为 “unknown command GET 100%坑爹的redisCommand”。。。怎么也看不出来这条命令哪里错误了,好吧,老老实实的按照hiredis的demo代码来写:
string key = "100%坑爹的redisCommand "; 

redisCommand(c, "GET %s", key.c_str());


这次终于好使了!以上就是本次的坑爹的hiredis API使用之旅,谢谢!

最后

以上就是迷你月饼为你收集整理的坑爹的hiredis API使用的全部内容,希望文章能够帮你解决坑爹的hiredis API使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部