redis持久化方案 RDB
RDB也叫做redis数据快照,也就是把redis的数据写入磁盘进行持久化,可以通过配置redis的config文件,指定多少秒存内存了多少个key则进行RDB,也可以通过save或bgsave命令进行手持久化,save是占用redis主进程,bgsave是开启一个子进程进行持久化,当redis正常停机也会进行一次RDB。bgsave执行流程:1.子进程fork主进程复制页表共享内存 2.子进程读取内存数据写入新的RDB文件并覆盖原来的RDB文件 细节:子进程和主进程之间数据共享是通过页表的复制实现的,主进程的页表映射为物理内存,子进程通过复制得到的页表也同样映射到相同的物理内存。此时,物理内存会被标记为read-only,这是如果主进程要进行写操作,就会复制一份原来的数据出来,并对复制出来的数据进行修改,极端形况下,如果子进程RDB操作耗时过多,这时如果所有的数据都要进行写操作,就会内存翻倍可能会内存溢出。如果在未RDB操作时有数据写入且redis宕机就会造成数据丢失,如果把RDB时间间隔改小则会造成如果你的数据过大RDB时间就会很长,高频率RDB大大影响性能,同时RBD时间会小于RDB间隔时间就会造成一些问题。
redis持久化方案 AOF
redis每执行一次写操作都会把命令记录在AOF文件中
下面是三种AOF模式的比较
因为AOF是记录写操作的命令,所以可能会存在记录对一个key重复多次操作的命令,但事实上只有最后一次命令是有效的,所以可以通过bgrerwirteaof来实现对多余命令的压缩减少内存消耗
RDB和AOF的比较