使用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中内存比文件大)
分享到:
相关推荐
- Redis 提供了许多参数以优化性能,如哈希表的压缩阈值(`hash-max-zipmap-entries`、`hash-max-zipmap-value`),列表的最大压缩长度(`list-max-ziplist-entries`、`list-max-ziplist-value`),集合的整数集合最大...
请注意,以上只是一部分配置选项,Redis还有许多其他可调整的设置,如`lua-time-limit`(Lua脚本执行时间限制)、`hash-max-zipmap-entries`(哈希类型压缩阈值)等。理解并正确配置这些参数,能确保Redis在各种应用...
Hash类型的内存优化可以使用hash-max-zipmap-entries和hash-max-zipmap-value参数;Set类型可以通过set-max-intset-entries参数来优化内存。此外,通过分析网络接口、线程模型、缓存一致性、锁的复杂性和死锁问题等...
- `hash-max-zipmap-entries` - `hash-max-zipmap-value` - `list-max-ziplist-entries` - `list-max-ziplist-value` - `set-max-intset-entries` - `zset-max-ziplist-entries` - `zset-max-ziplist-value` ...
hash-max-zipmap-entries 64 hash-max-zipmap-value 512 当value这个Map内部不超过多少个成员时会采用线性紧凑格式存储,默认是64,即value内部有64个以下的成员就是使用线性紧凑存储,超过该值自动转成真正的...
`hash-max-zipmap-entries` 和 `hash-max-zipmap-value` 控制哈希表在达到一定大小后转换为 ZIPMAP 以节省内存;`activerehashing yes` 表示启用定期的哈希表重哈希,保持内存利用率。 以上是 Redis 配置文件中的...
- **hash-max-zipmap-entries**:哈希表中压缩映射的最大条目数,默认为512。 - **hash-max-zipmap-value**:压缩映射中每个条目的最大长度,默认为64字节。 这些参数可以帮助调整Redis内部数据结构的表现形式,以...
例如,当Hash中的字段数量小于`hash-max-zipmap-entries`配置项指定的值(默认64),并且字段的最大长度不超过`hash-max-zipmap-value`(默认512字节)时,Redis会使用压缩映射(Ziplist)编码。同样的规则也适用于...
17. **其他高级配置**: 如`glueoutputbuf`、`hash-max-zipmap-entries`等,用于优化内存使用和性能。 请注意,Redis官方并不推荐在生产环境中使用虚拟内存功能(VM),而是倾向于使用AOF或RDB持久化策略。此外,...