资讯专栏INFORMATION COLUMN

Redis在执行BGSAVE和BGREWRITEAOF命令时,哈希表的负载因子>=5,而未执行

explorer_ddf / 3211人阅读

摘要:前言今天在看设计与实现,讲解字典的实现时,说道在执行和命令时,哈希表的负载因子大于等于,而未执行这两个命令时大于等于。哈希表的扩展因子哈希表已保存节点数量哈希表大小。

前言

 今天在看《Redis设计与实现》,讲解字典的实现时,说道Redis在执行BGSAVE和BGREWRITEAOF命令时,
哈希表的负载因子大于等于5,而未执行这两个命令时大于等于1。
 而解释仅仅是提了一句原因是:

在执行BGSAVE和BGREWRITEAOF命令时,Redis需要创建当前服务器进程的子进程,而大多数操作系统都采用写时
复制技术来由于子进程的使用效率,所以在子进程存在期间,服务器会提高执行扩展操作所需的负载因子,从而尽可
能避免在子进程存在期间进行哈希表扩展操作,这可以避免不必要的内存写入操作。
哈希表的扩展因子:哈希表已保存节点数量/哈希表大小。扩展因子决定了是否扩展哈希表。

因为基础薄弱,所以对这个结论产生了很多疑问:

什么是写时复制?

为什么使用写时复制技术创建子进程时进行哈希表扩展会造成不必要的内存写入操作?

写时复制

 要了解什么是写时复制,我们还需要知道操作系统是怎么创建子进程的。我们一linux操作系统进行讲解。
 创建子进程的唯一方式是调用fork函数,这个fork函数为创建一个和父进程几乎完全相同的进程。创建子进程时,需要将父进程的除了正文段
之外几乎所有的数据拷贝至子进程,如堆,栈,数据段。

 创建子进程拷贝几乎所有父进程的数据会导致创建子进程的过程很慢,从而有了写时复制这种技术来提高创建子进程的过程。从下面参考的
博客中的知识我认识到:

 在不使用写时复制技术的情况下,我们为进程创建一个子进程时会导致子进程拷贝父进程的数据段,堆,栈,仅有
正文段不会被拷贝。

 而在使用写时复制技术的情况下,我们为进程创建一个子进程时不会拷贝任何数据,此时父进程和自己成共享同一份数据,
仅当父进程或者自己成需要对这份数据进行写入时,才为子进程分配相应的物理空间。
为什么使用写时复制技术创建子进程时进行哈希表扩展会造成不必要的内存写入操作?

 了解了写时复制之后我们就能回答这个问题了。首先服务器进程在执行BGSAVE或者BGREWRITEAOF命令时,创建了新的子进程;此时如果我们扩展哈希表,那么那么相当于忘父进程写入数据,同时会导致子进程进行复制操作。
参考:
Linux写时拷贝技术(copy-on-write)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37257.html

相关文章

  • Redis 数据结构之Map(字典)

    摘要:渐进式的操作步骤为分配指定空间,让字典同时持有和两个哈希表。其实这就是哈希表结构中字段的意义,就是用来保存这个数字直接用于计算。 概念 哈希表:也叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。 哈希函数:哈希表中元素是由哈希函数确定的。将数据元素的关键字K作为自变量,通过一定的函数关...

    Lowky 评论0 收藏0
  • Redis设计与实现》(1-5)个人学习总结

    摘要:注明设计与实现的个人学习总结,这本书对的讲解清晰易懂,如果深入学习可以看看这本书。字典的实现字典使用哈希表作为底层实现,每个哈希节点就是对应一个键值对。 注明:《R...

    Alliot 评论0 收藏0
  • (Redis设计与实现-1) 数据结构

    摘要:负载因子哈希表已保存节点数量哈希表大小渐进式为了避免对服务器性能造成影响,服务器不是一次性将里面的所有键值对全部到,而是分多次渐进式地将里面的键值对慢慢地到。步骤为分配空间,让字典同时持有和两个哈希表。 一.简单动态字符串 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)...

    forrest23 评论0 收藏0
  • COW奶牛!Copy On Write机制了解一下

    摘要:用于创建子进程等同于当前进程的副本。这个函数会有两次返回,将子进程的返回给父进程,返回给子进程。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。中断例程中,就会把触发的异常的页复制一份,于是父子进程各自持有独立的一份。 前言 只有光头才能变强 在读《Redis设计与实现》关于哈希表扩容的时候,发现这么一段话: 执行BGSAVE命令或者BGREWRITEAOF命令的...

    Coding01 评论0 收藏0
  • Redis篇 - 5. redis 持久化之 RDB & AOF

    摘要:持久化实现方式快照对数据某一时间点的完整备份。出故障时会丢失一秒数据刷新策略让系统决定不可控。从而减少磁盘占用量,加快数据恢复速度。根据实际需求进行设定。重写集中管理单机多部署情况下,发生大量可能会内存爆满。规划不当可能会产生等问题。 Redis 持久化实现方式 快照对数据某一时间点的完整备份。例如Linux 快照备份、Redis RDB、MySQL Dump。 日志将数据的所有操...

    voidking 评论0 收藏0

发表评论

0条评论

explorer_ddf

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<