redis缓存持久化方式
Redis有两种存储方式:持久化和非持久化。
Redis非持久化需要配置,Redis在安装时默认开启持久化功能,如果仅把Redis内存缓存使用(非持久化),不如考虑APCU或者Memcache。
Redis的持久化分为两种方式,这两种方式分别是RDB(默认启动)和AOF
RDB的备份时通过快照来完成的,具体来说是将符合设定条件的Redis在硬盘中生成一份副本文件并保存在硬盘中。
AOF是将每次的命令追加到硬盘文件中,当服务器出现了故障的时候,从文件中读取丢失数据时间点之后的命令,并且重新执行一遍。
RDB的实现方式分为多种,分别是:
1.SAVE(同步)和BGSAVE(异步)命令
BGSAVE是在后台执行异步操作,但是他每一次都会返回OK,这个OK不是快照存储成功,而是快照执行成功,所以并不知道快照是否成功,想要知道的话还需要执行lastsave的命令
2.根据配置文件执行
3.执行关闭Redis时执行
4.主从复制的时候执行
AOF的实现方式是按纯文本的方式记录了Redis执行的命令,实现方式分别问手动触发和自动触发,自动触发需要配置两个协议
对比
持久化方式 |
RDB |
AOF |
占用空间 |
低 |
高 |
存储速度 |
低 |
高 |
恢复速度 |
高 |
低 |
数据安全 |
会丢失数据 |
基本上不会 |
资源消耗 |
高 |
低 |
启动优先级 |
低 |
高 |
RDB/AOF恢复数据方式是将备份文件(dump.rdb)移动到安装目录并且修改redis的配置参数,然后启动服务即可。此外REIDS允许RDB以及AOF同时使用。
RDB丢失数据是因为每次快照是存在间隔时间的,AOF会丢失数据是因为他把文件村硬盘中,但是系统默认是30秒执行一次同步操作,除非在配置中设置appendfsync参数。这个参数有三种,一种是总是,一种是每秒同步一次(默认),一种是不主动同步。
RDB创建子进程时,会对父进程进行完全拷贝,导致在创建子进程时会消耗大量的时间。而AOF虽然也会创建子进程,但是他并不会完全拷贝父进程,而是该子进程只需要能够将父进程之前执行过的指令添加AOF缓冲区和重写缓冲区即可。因此存储速度来说RDB更慢一些,资源消耗更高一些。而RDB存储的是文件快照,并且是压缩级的;而AOF存储的是操作指令,一个数据可能有很多个指令,所以空间占用来说AOF更大一些。