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);
搞定!




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值