redisCommand out of memory

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);

这段代码今天调试总是发现redisCommand失败,返回的reply是空的;而打印redis_ctx显示错误信息是out of memory。

网上搜到的各种问题归为两类,一类是%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);
搞定!




你可能感兴趣的:(redis,linux,64位)