1.redis中有哪些持久化方式?
? redis中的持久化有两种方式,分别是RDB和AOF,其中RDB是redis默认的持久化方式。
2.RDB的工作原理
? RDB持久化方式会创建(fork)一个子进程,子进程中的数据信息和主进程中的数据信息完全相同,主进程进行客户端的数据交互,子进程进行磁盘的IO操作,子进程进行持久化时会产生一个临时文件,并将数据写入到这个临时文件当中,当持久化完成之后会将主线程中的dump.rdb文件替换掉。
3.RDB触发机制
? RDB中有以下几种触发持久化的方式:
自动触发RDB持久化
-
redis.conf文件中有一个关于save的配置,如下图,如果900s内有一个数据进行了更新(增删改),那么就会持久化;如果在300s内有10条数据进行了更新那么就会持久化;如果在60s内有10000条数据进行了更新那么就会持久化。即更改数据越多,持久化周期越小。 -
当使用"shutdown"命令关闭redis时会自动持久化 -
当使用"fulldb"命令清除内存中的数据时会自动持久化
手动触发RDB持久化
- 使用save/bgsave命令会持久化,save是使用主进程持久化,会使效率变低,不用;gbsave是使用子进程持久化。
4.RDB持久化的缺点
? 当redis的服务器突然宕机之后,RDB还没来得及将数据持久化,会使数据丢失。
? AOF就是来解决RDB丢失时间长的问题。
5.AOF的工作原理
? 将Redis的操作日志以追加的方式写入文件,读操作是不记录的,当redis开机的时候,会将AOF日志文件中的命令进行读取操作。
? AOF是将命令先记录在缓冲区,缓冲区默认大小为1M,然后定时持久化到AOF持久化文件当中。AOF是没有fork主进程的,使用主进程进行的持久化。
6.开启AOF
? redis中AOF默认是关闭的。
? 在redis.conf文件中,将appendonly改为yes,如下:
7.AOF触发机制
? AOF先将命令存在缓冲区,然后定时从缓冲区中向磁盘进行刷新,那么触发AOF从缓冲区向磁盘中刷新的机制是什么呢?
- no:表示当缓冲区数据满了之后再同步到磁盘,这种显然不能使用,如果宕机之后,就会形成和RDB同样的问题。
- always:同步持久化,每次发生数据变更时都会同步到磁盘。
- everysec:表示一秒同步一次,这个也是默认值,但是可能会丢失1s以内的数据。
8.RDB和AOF的优缺点
- RDB:适合数据恢复,数据丢失多
- AOF:保证数据安全,恢复数据慢
9.RDB和AOF的优先级
? 如果同时开启RDB和AOF的话,那么redis开机之后读取的持久化文件是AOF的持久化文件,并且持久化时是按照AOF的策略去走的。
|