RDB是通过快照完成的、当符合一定条件时 :Redis会自动将内存中的所有数据生成一份副本并存储在硬盘上,这个过程即为“快照”。
1、标题Redis快照触发条件:1.1、根据配置规则进行自动快照
1.2、用户根据 save 或 bgsave 命令
1.3、执行 flushall 命令
1.4、执行复制(replication)时。
Redis允许用户自定义快照条件,例如redis 安装目录中包括的样例配置文件的预制 3 条件:
save 900 1 #15分钟内更改数据 1 次 save 300 10 #5分钟内更改数据 10次 save 60 10000 #1分钟内更改数据 10000次
每条快照条件占据一行,并且以 save 参数开头。同时可以存在多个条件,条件只见是以“或”的条件。
1.2用户执行save 或 bgsave命令1、当进行服务器重启、手动迁移以及备份时、手动进行快照操作。
save命令:
当执行save命令时,Redis同步进行快照操作、在快照执行时或阻塞所有来自客户端的请求。
2、bgsave命令
bgsave命令:可以在后台 异步的进行快照操作,快照的同时还可以接收来自客户端的请求,执行 bgsave 后Redis 会立即返回 OK 表示开始执行快照操作,如果想知道快照是否完成,可以通过 LASTASVE 命令获取最近一次成功执行快照的时间。
当执行FLUSHALL 命令时,Redis会清除数据库中的所有命令。
注意:不论清除数据库的过程是否触发自动快照条件,只要自动条件不为空,Redis就会执行一次快照操作。
例:当定义的快照条件为 1 S 内修改 10000个键进行自动快照时,而当数据库只有一个键时,执行FLUSHALL 命令也会触发快照,即使这一过程只有一个键被改动。当没有定义自动快照条件时,执行FLUSHALL命令不会进行快照。
当设置主从模式时,redis会复制初始化进行自动快照,即使没有定义自动快照,并且没有手动执行快照的操作,也会生成RDB条件。
2、快照原理:Redis默认会将快照文件存储在Redis 当前进程的工作目录中的 dump.rdb文件中。可以通过配置dir 和dbfilenname两个参数分别指定快照文件的存储路径和文件名。
3、快照过程:1、Redis 会使用fork 函数复制一份当前进程(父进程) 的副本(子进程);
2、父进程继续接受并处理客户端发来的命令,而子进程开始内存中的数据写入硬盘中的临时文件;
3、当子进程写完所有数据后会用该临时文件替换旧的 RDB 文件,至此一次快照操作完成。
问题:通过RDB方式实现持久化,一但Redis异常退出,就会丢失最后一次快照以后更改的所有数据。
解决:1、通过组合设置自动快照条件的方式将可能发生的数据损失控制到可以接受的范围。
2、如果数据相对重要,则可以用AOF方式进行持久化。
AOF可以将Redis 执行的·每一条数据写命令追加到硬盘文件中。会降低Redis的性能。
2、开启AOF默认情况下:Redis 没有开启AOF方式的持久化,通过 appendonly 参数启用
appendonly yes
开启AOF 持久化后每执行一条会更改Redis中数据的命令,Redsi就会将该命令写入到磁盘中的AOF文件中。
AOF文件的保存位置和RDB文件的位置相同。
set foo 1 set foo 2 set foo 3 get foo
Redis会将前三条命令写入AOF文件中,此时文件如下
*2 $6 select $1 0 *3 $3 set $3 foo $1 1 *3 $3 set $3 foo $1 2 *3 $3 set $3 foo 3
注意:随着执行的命令越来越多。aof的文件也会越来越大,
解决:每当达到一定条件时redis就会自动重写AOF文件, 可以在配置文件中设置
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage :意义:时当前AOF文件大小超过上一次重写时AOF文件大小的百分之多少时会再次进行重写,如果是第一次重写,则以启动时的AOF大小为依据。
auto-aof-rewrite-min-size 64mb :意义:参数限制允许重写的最小AOF文件大小,
同步硬盘数据每次执行更改数据库内容的操作时,AOF都会将命令记入到AOF文件中,但是由于操作系统的缓存机制,数据并没有真正写入带硬盘,而是进入系统的硬盘缓存。
在默认情况下系统每 30s 会执行一次同步操作,以便将硬盘缓存的内容真正写到硬盘,
#appendfsync always appendsync everysec #appendfsync no



