int redis_set(const char *type, const void *key, int keylen, const void *value, int valuelen, int expire) { .... reply = redisCommand(redis_ctx, "SET %s-%b %b EX %d", type, key, keylen, value, valuelen, expire);
网上搜到的各种问题归为两类,一类是%s对应的参数不是正常字符串,另一类是%后面的字符不是正确的格式。
经过调试,确认我的代码没有这两类问题。
没办法了,只好重新编译hiredis,增加调试信息,单步跟踪。最后终于发现,有个%b格式的参数,它的size超大,就没法给这个参数分配内存了。
这才想到,上面%b格式的参数keylen和valuelen都是int类型的,而redisCommands要求它们是size_t类型的。这在32位系统上没有问题,而在64位系统中,传入一个32位int,而读出一个64位的size_t,它的值肯定不对。
所以我们的代码这样修改:
int redis_set(const char *type, const void *key, size_t keylen, const void *value, size_t valuelen, int expire)
或者:
reply = redisCommand(redis_ctx, "SET %s-%b %b EX %d", type, key, (size_t)keylen, value, (size_t)valuelen, expire);搞定!