afanti 2020-02-19
目录
redis是一个基于内存的数据库,故在redis正在运行的数据都在内存中,而内存掉电,内存上所以数据都会消失。故把redis当成数据库使用时就需要对redis进行持久化。
在说redis持久化的时候,我们先来聊聊其他的知识。linux的父子进程。在Linux中使用fork()函数会给当前正在运行的进程创建一个子进程。那么现在问题就来了,fork时父子进程中的数据有什么关系呢?一般说到进程我们都会知道进程间彼此是数据隔离的。然而实际上,子进程在刚创建时,可以看到子进程中的数据。而在修改该数据时,却不会对父进程造成影响。同样子进程也不会受到父进程修改数据的影响。而造成这种现象的,正是因为linux的copy on write机制。
copy on write:是一种内核机制,通俗来讲就是写时复制。及创建子进程并不发生复制,创建子进程后父子进程共用数据。只有在修改数据是才会创建新的空间。
这样做的好处是创建进程变快了。而且根据开发经验,我们创建子进程后不可能父子进程把所有数据都改一遍。而这套机制就是指针支撑的。玩的是指针
redis中有两种数据到存储方式,rdb和aof。下面我们来着重讲一下这两种持久化方式:
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
redis的rdb持久化方式有存储的是时点数据即某一个时间点的数据。因为如果存储实时更新的数据的话,如果一直有数据写入会导致,持久化过程一直进行,降低了redis的快捷的特性。因此redis有两种持久化数据的方式
以上两个命令直接可以在redis的客户端运行。
注意如果使用配置文件的方式配置数据持久化,配置文件中给出bgsave的规则: save这个标识。配置的规则:(要修改的文件是dbfilename dump.rdb,文件一般存储在var/lib/redis/6379)
save 900 1 save 300 10 save 60 10000
该规则意味着,在每60秒检测一次redis的数据量,如果达到10000就进行持久化,否则不持久化。在每300秒检测一次redis的数据量,如果达到10就进行持久化,否则不持久化。在每900秒检测一次redis的数据量,如果达到1就进行持久化,否则不持久化。
与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.
丢失数据相对多一些时点与时点之间窗口数据容易丢失。8点得到一个rdb,9点刚要写一个rdb,挂机了。那么8~9之间的数据就会丢失。
AOF实际是把对redis操作的操作记录,通过日志的方式记录下来,这样想要恢复数据库文件,只需要把所以指令执行一遍就行。
需要开启aof只需要把dump修改appendonly该为yes即可。
appendonly yes
AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态
弊端,体量无线变大, 恢复慢
为解决aof的弊端日志,优点如果能保住,还是可以用的。就有一个方案:设计一个方案让日志,AOF足够小
就是hdfs,fsimage+edits.log 。让日志只记录增量,合并操作的中间过程。
而4.0版本也是这项技术的分界点
从这点可以看出,aof和rdb是可以共存的。
Redis 支持一种有趣的特性: 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。Redis 2.2 需要自己手动执行 BGREWRITEAOF 命令; Redis 2.4 则可以自动触发 AOF 重写, 具体信息请查看 2.4 的示例配置文件。
AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制:
搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。
redis的持久化想要开启其实挺简单的只需要,修改conf配置文件的几个配置项即可。
当二者混合使用时,如果redis服务器停止后重新运行,那么redis恢复数据只会从aof中同步,而不会去向rdb同步。而且在主从复制时,rdb会记录上一次连接的端口,而aof不会。所以主从复制时,如果没有开启aof,那么从服务器在断开主服务器后重新连接主服务器,只会同步从服务器断开时的增量数据,而开启aof后从服务器需要同步主服务器中的所有内容。