Redis中所有数据都有key-value,这是通过哈希表实现的,redis的字典数据结构保存了两张哈希表,采取了渐进哈希的方法。
字典与渐进式rehash
总结:
(1)redis字典使用哈希表作为底层实现,哈希表使用链地址法解决键冲突
(2)每个字典有两个哈希表,ht[0]在平常使用,ht[1]在rehash时使用
(3)rehash并不是一次性完成的,而是渐进式的进行。
在此过程中,字典的增删改查操作会同时在ht[0],ht[1]两个表上进行,比如:
查找一个键,会先在ht[0]中查找,没找到再到ht[1]中找。
新添加到字典的键值对一律会被保存到ht[1]中而不是ht[0].
Redis在持久化时,如果是采用BGSAVE命令或者BGREWRITEAOF的方式,那Redis会fork出一个子进程来读取数据,从而写到磁盘中。
总体来看,Redis还是读操作比较多。如果子进程存在期间,发生了大量的写操作,那可能就会出现很多的分页错误(页异常中断page-fault),这样就得耗费不少性能在复制上。
而在rehash阶段上,写操作是无法避免的。所以Redis在fork出子进程之后,将负载因子阈值提高,尽量减少写操作, 避免不必要的内存写入操作,最大限度地节约内存。