Redis-持久化

持久化机制

RDB(默认开启的)

RDB:Redis(单进程:不能同时处理命令和处理持久化)会单独创建fork一个与当前进程一样的子进程来进行持久化,这个子进程的所有数据(变量,环境变量,程序设计计数器等)都和原进程一模一样,会先将数据写入到一个(启动目录下)临时文件中,待持久化结束了在用这个临时文件(temp-xxxx.rdb)替换上次的持久化好的文件(dump.rdb),整个过程中,主进程不进行任何的I/O操作,确保了极高的性能。

持久化什么时候触发的

shutdown时若未配置AOF,会自动触发
配置文件中的默认快照配置

# Save the DB on disk:
#
#   save  
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#
#   Note: you can disable saving completely by commenting out all "save" lines.
#
#   It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   like in the following example:
#
#   save ""

# 这里指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# 这里表示900s内有1个更改,300s内有10个更改 以及60s内有10000个更改
# 禁用rdb持久化策略,不设置save指令或者直接给save传入一个空字符串就行
save 900 1
save 300 10
save 60 10000

主从复制模式下RDB模式是无法关闭的
执行命令save或者bgsave
1.save时只管保存,其他不管,全部阻塞(使用主进程)
2.bgsave:redis会在后台异步进行保存,同时可以响应客户端的请求(fork一个子进程)
3.执行flushall命令 清空所有数据库也会生成一个没有数据的dump.rdb文件

AOF

丢失数据比RDB要少很多(AOF丢失数据间隔不会超过2s)
1.原理:将Redis的操作日志以追加(append)的方式写入文件中,读操作不记录。
2.触发机制:(根据配置文件配置项)

no:表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证)(在缓存中可能丢失数据)
always:同步持久化,每次发生数据变更 时,立即记录到磁盘(慢,安全)I/O次数太多,消耗系统资源
everysec:表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据)(二者中和)

AOF文件(保存的字符串是协议)

(Redis框架给服务其发送的就是这样的字符串)
*2(*表示下面有两组命令)
$6($表示接下里一个命令的长度为6)
SELECT
$1
0
*3
$3
set
$5
aofff
$4
test

3.AOF重写触发机制(给appendonly.aof文件瘦身)
当AOF文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。
auto-aof-rewirte-min-size 64mb
当AOF文件大小增长率大于该配置的项时自动开启重写
auto-aof-rewirte-percentage 100 -指超过原大小的100%

4.如何重写
多条写入命令可以合并成一条。比如上面的lpush命令了3次,最后合并成1条
重写后AOF文件只保留最终数据的写入命令

总结:有rdb还选择aof的:aof丢失数据少
aof与rdb同时存在,优先aof
RDB(消耗低丢失多)
AOF(消耗高丢失少)

RDB持久化方式的优点:

  • 非常适合全量备份
  • 恢复速度比AOF快

RDB持久化方式的缺点:

  • RDB方式没有办法做到实时持久化
  • 版本兼容RDB格式问题

AOF持久化方式的优点:

  • 做到最多丢失1-2s内的数据(最多丢失2s数据,因为AOF追加阻塞)

AOF持久化方式的缺点:

  • AOF文件比RDB文件大
  • 可能导致追加阻塞

RDB:适合大规模的数据恢复,对数据完整性和一致性不高,在一定时间间隔做一次备份,如果aof的话,就会丢失最后一次快照后的所有操作。
AOF:根据配置项而定
官方建议两个同时开启,优先使用aof机制

你可能感兴趣的:(Redis-持久化)