Redis中的持久化机制
Redis中的持久化机制介绍
- 对于redis来说,为什么需要持久化呢?
- 如果一个redis master因为某种原因挂掉了,比如是因为这个服务器宕机了,那么就需要立即对它进行重启,以尽快的能够对外提供服务,那么,如果没有持久化机制的存在,我们都知道,使用redis的原因主要就是为了缓解数据库的压力,让更多的请求数据可以直接通过redis查到,所以在重启了redis之后,如果大量的请求过来了,redis中却没有数据了,就会造成所有的请求都直接打到了数据库上,可能服务器才刚重启,数据库又挂掉了,所以这样是肯定不行的。
- 而redis的持久化机制就是用来应对灾难发生时的数据恢复的。
- 当服务器宕机又重启后,能够立即通过redis持久化的数据进行数据恢复,而请求打过来时,一样的能够通过redis查到。而持久化的机制有两种,RDB和AOF。
RBD持久化策略
- 原理:RDB机制,是对redis 中的数据做周期性的备份的,可以配置一些检查点,每隔着多少分钟有指定条的数据发生了改变,那么redis便会自动去生成一个当前数据的rdb快照文件,生成完成之后再覆盖掉原来的文件
- 性能:RDB持久化机制对redis读取和写入的性能影响比较小,因为它不会在redis每次进行读写的时候处理额外的操作产生一定的性能损耗,但是在生成快照文件的时候,redis会fork出一个子进程出来,通过子进程来执行磁盘操作写入rdb文件,因此如果redis中的数据量过大,在fork子进程的时候就会导致redis将在一定时间内不能对外提供服务。
- 文件:rdb文件是对某一个时间点的redis中的所有数据的一次快照,存储的就是数据,所以当redis在通过rdb文件将数据加载到内存时,速度比较快,但是,在进行灾难恢复时,由于其数据只是最近一个时间节点的快照,所以并不能将数据恢复到灾难发生时,因此,使用rdb文件恢复会导致redis丢失一部分数据。
AOF持久化策略
- 原理:AOF机制,会对redis 中的每次数据写入操作做记录,执行写入操作,然后可以指定写入保存策略,比如每隔一秒,它会通过一个后台线程执行一次fsync操作,将数据保存到磁盘中去。
- 性能:AOF持久化机制对redis读写性能影响比较大,它会降低redis每秒的最大读写速度,由于AOF机制,在redis每执行一次写入操作时,redis都会对其做一次记录,将其写入AOF文件中,它有三种写入保存策略:
1)写入时不保存,由操作系统去执行或者额关闭redis时保存到磁盘,其写入和保存操作都是在redis主线程上进行的。那么当redis挂了的时候,数据损失的量就得看上一次操作系统保存数据到磁盘的时间点了。
2)写入后每隔一秒保存,写入操作由主线程执行。这样的话,即使redis挂了,也只会损失一秒钟的数据。
3)写入时直接保存,写入和保存操作都是在主线程上执行的,因此它的数据完整性最高,但是同时性能也最差,因为redis是单线程执行命令的,把写入和保存操作也放到这个线程上去执行,就会大大影响redis的读写效率。 - 文件:AOF文件是对redis写入操作的记录,每当有一条写入操作,redis便会在AOF文件上追加一条记录,它保存的并不是原数据,因此,同样的数据量,AOF文件会比RBD文件更大,且在加载数据到内存时也比RBD要慢。
- 而如果AOF文件过大时们就会触发重写操作,重写操作并不会影响主线程的运行,因此在进行重写的时候,依然是可以对外提供服务的。
- 那么在进行重写的时候,如果有新的写入操作进来,它要怎么才能不丢失呢?在重写的时候,redis主线程还会把记录写入到一个缓存中,重写线程可以通过这个缓存来将记录写入新的AOF文件。
- 有一点疑问的就是,AOF是怎么通过重写来减少文件大小的呢?由于文件中存在对一个数据的多次操作,那么我们只需要将这个数据的最后一次操作的结果记录到文件中就行了,这样的话就是减少很大的磁盘空间。
总结
一般企业可以同时打开这两种数据持久化方式,使用RDB可以做冷备份,可以定期的将数据存储到云端,使用AOF可以更好地保证数据的完整性,同时也可以用RDB来做后备,防止AOF文件损坏。