Redis持久化简介将数据存储在磁盘上就是持久反之存储在硬盘上就是不持久这里可以重启主机或者重启进程看数据是否还存在来做区分。Redis是一个内存数据库将数据存储在内存中要想做到持久就需要让 Redis把数据存储在硬盘上。因此Redis就会即在内存中存数据也会在硬盘上也存数据这样的两份数据理论上是完全相同的但实际上可能会有概率存在差异具体得看持久化的方式。当查询某个数据时直接从内存中读取硬盘的数据只是在Redis重启时用来恢复内存中的数据的。Redis实现持久化主要有两种策略RDBRedis Database和AOFAppend Only File。RDBRDB是定期将Redis内存中的所有数据都写入硬盘中并生成一个“快照”相当于保存内存中的信息生成一个文件存储在硬盘中后续Redis一旦重启了就可以根据“快照”将内存中的数据恢复出来。定期可以分为手动触发和自动触发。手动触发为用户通过Redis客户端执行特定的命令来触发快照生辰自动触发为在Redis配置文件中设置Redis自动触发的时间。手动触发的命令可以使用save和bgsave指令执行save指令的时候Redis就会全力以赴地进行“快照”生成操作此时就会阻塞Redis地其它客户端指令一般不建议使用save指令bgsave指令不会影响Redis服务器处理其它客户端的请求和指令这个过程是通过“多进程”来实现并发编程的。bgsave的整体执行流程如下Redis生成的文件存放在redis地工作目录中对应rdb镜像文件这个文件是个二进制文件Redis将内存中的数据以压缩的形式保存到这个二进制文件中。当执行生成rdb镜像操作的时候就要将快照数据先保存到一个临时文件中当这个快照生成完毕后删除之前的rdb文件再把新生成的临时rdb文件名字改成新的dump.rdb。因此自始至终rdb文件都是只有一个的。生成的rdb文件中的数据不是立即更新的自动触发时要在特定时间内达到对应的修改次数才会触发修改。但是每次生成一次rdb快照开销都较大因此不能让这个操作执行的太频繁。当出现异常情况时如服务器崩溃等redis服务器来不及生成rdb内存中尚未保存到快照中的数据就会随着重启而丢失。RDB最大的问题就是不能实时地持久化保存数据在两次生成快照之间实时地数据可能会随着重启而丢失。AOFAOF类似于MySQL中的binlog会将用户的每个操作都记录到文件中当redis重新启动时就会读取这个AOF文件中的内容用来恢复数据。当开启 AOF时rdb内容就不再生效了启动的时候就不再读取rdb文件的内容了。若要开启AOF在redis的配置文件中修改appendonly为yes即可。AOF的工作机制是先写入一个内存中的缓冲区等写入的内容达到一定大小后再统一写入硬盘。redis给出了一些选项可以让使用者来决定怎么取舍刷新的频率越高性能影响越大同时数据的可靠性越高redis配置文件中有一个appendfsync对应的配置选项有三个分别为always、everysec和noalways为命令写入aof_buf后调用fsync同步完成后返回everysec为命令写入aof_buf后只执行write操作不进行fsync。每秒由同步线程进行fsyncno为命令写入aof_buf后只执行write由OS控制fsync频率。AOF的触发机制也分为手动触发和自动触发手动触发的命令为bgrewriteaof。自动触发根据auto-aof-rewrite-min-size和auto-rewrite-percentage参数确定自动触发时机auto-aof-rewrite-min-size表示触发重写时AOF的最小文件大小默认为64MBauto-rewrite-percentage代表当前AOF占用大小相比较上次重写时增加的比例。基本流程如下