本文主要是介绍redis哈希表的rehash和CPU占用高的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在某银行双十一前,生产上进行压测碰到了一个问题:在某一时刻,CPU使用率占用比非常高,达到了80%。而在这一时刻,redis响应时间非常慢,导致了这一时刻大笔交易发生了超时。经一系列分析,找出CPU使用率过高的原因:redis上存在一个以天为单位的set集合类型的大key,正是由于这个大key做rehash,导致CPU使用率占用过高。
在讲rehash问题,先讲讲字典和集合类型。
字典
redis所用的字典由dict.h/dict结构表示:
typedef struct dict {//特定类型dictType *type;//私有数据void *privdata;//哈希表dictht ht[2];//rehash索引,当rehash不在进行时,值为-1long rehashidx; /* rehashing not in progress if rehashidx == -1 */unsigned long iterators; /* number of iterators currently running */
} dict;
在这个结构表里,需要关注的是哈希表。ht属性是一个包含两个项的数组,数组类型是dictht。一般情况下,字典只会使用ht[0]哈希表,当字典进行rehash的时候,字典就会使用ht[1],将ht[0]的元素迁至ht[1]。然后将ht[1]设置为ht[0]。
而在redis上dictht的定义是这样的:
typedef
这篇关于redis哈希表的rehash和CPU占用高的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!