redis -- hash_max_zipmap_entries设置过大有问题

使用redis时为了使用hash追求更高的内存使用率,我们一般都用hash结构,并且有时候会把hash_max_zipmap_entries这个值设置的很大,很多资料也推荐设置到1000,默认设置为了512,但是这里有个坑

 

#define ZIPMAP_BIGLEN 254
#define ZIPMAP_END 255

 

 

/* Return the number of entries inside a zipmap */
unsigned int zipmapLen(unsigned char *zm) {
    unsigned int len = 0;
    if (zm[0] < ZIPMAP_BIGLEN) {
        len = zm[0]; //假如subkey个数少于254,直接取出
    } else {
        unsigned char *p = zipmapRewind(zm);
        while((p = zipmapNext(p,NULL,NULL,NULL,NULL)) != NULL) len++;//不然的话,完整遍历
        /* Re-store length if small enough */
        if (len < ZIPMAP_BIGLEN) zm[0] = len;
    }
    return len;
}

 

 

 

看到没,同志们,当zm的subkey数超过ZIPMAP_BIGLEN时,你就悲剧了,每次获得zm的subkey的个数都得去遍历整个zipmap。假如大量并发查询到zm时,都需要去完整遍历zm,结果就是CPU像打了鸡血一样的上去了。

 

 

推荐几个文章:

http://stackoverflow.com/questions/10004565/redis-10x-more-memory-usage-than-data(为什么redis中内存比文件大)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值