持久化概念:可以将数据写入到磁盘中,在服务器出现停机或者宕机;再次启动redis时,会将磁盘中的备份数据加载到内存中恢复使用,
redis中有两种持久化的机制:
1、RBD(快照)
实现原理:redis是由C语言实现的,fork函数会把主线程复制一个子线程,子线程会把内存的数据依次遍历出来,存放到指定的二进制文件当中:dump.rdb
实现方式:只需要更改配置文件即可,默认提供三种级别的快照方式:
指定在多长时间内,有多少次更新操作,就将数据同步到备份文件中,可以多个条件配合
[外链图片转存失败(img-IWoe8gMO-1564968486715)(.\Redis_RDB.png)]
优点:
- 使用起来简单,只要修改配置文件,把所有的数据存放到一个文件中,
- 文件以二进制形式存放,读写很快
缺点:
- 断电容易造成数据丢失,断电的时间段内的数据不能备份
2、AOF(append only file)
实现原理:redis可以将执行的 ‘所有指令’ 追加到文件中持久化
实现方式:默认没有开启只需要更改配置文件
appendonly yes # 是否开启AOF
appendfilename “appendonly.aof” # AOF文件
优点:
- 使用起来简单,只要修改配置文件, 日志文件是单独文件
- 可以修改日志文件得大小:BGREWRITERAOF
使用AOF机制的缺点是随着时间的流逝,AOF文件会变得很大。但redis可以压缩AOF文件。
缺点:
- 文件大小有限制
- 读取速度比RBD要慢
写入时机:
- appendfsync always:把每个写命令都立即同步到aof,很慢,但是很安全
- appendfsync everysec:每秒同步一次,是折中方案
- appendfsync no:redis不处理交给OS来处理,非常快,但是也最不安全
redis允许我们同时使用两种机制,通常情况下我们会设置AOF机制为everysec 每秒写入,则最坏仅会丢失一秒内的数据。