Redis必知必会(2) | 青训营

68 阅读2分钟

上一节内容主要介绍了Redis中持久化技术之一:AOF技术,它实现持久化的时候我们也发现它的短板,所以本节将介绍了另一个流行的持久化技术:RDB快照技术。

RDB快照简介

RDB快照技术和AOF技术对比有什么优势呢?RDB快照和AOF思路不同,RDB快照是将某个时刻的数据全部记录下来,而不是像AOF记录操作,所以RDB快照在恢复数据的时候不需要像AOF一条一条取出日志执行,而是直接将RDB快照数据读入内存即可。但是我们需要思考几个问题,RDB快照执行过程中是否阻塞?多久进行一次RDB快照合适?本节主要围绕这些问题展开。

RDB快照会阻塞吗?

Redis为了保证数据的可靠性,所以会进行全量快照。Redis中会通过bgsave创建子线程,通过子线程完成全量复制。如果内存中的数据量越大,那么进行全量快照的好事就越久,那在全量快照期间Redis主线程还能否接受新数据的写入呢?答案是可以的!这是因为Redis使用了COW(写时复制)技术,主线程和子线程同时执行读操作时互不干扰,但是如果主线程出现写操作的时候,会将修改的原数据拷贝一份为副本,然后在副本上执行修改操作,这就不影响bgsave子线程在原始数据上生成RDB快照。

多久执行一次RDB快照?

执行RDB快照的时机是一个值得思考的问题。假设我们执行RDB快照间隔非常久,一旦发生宕机,两次RDB快照之间的数据就会丢失;如果进行RDB快照非常频繁,会非常的占用带宽,同时fork子线程是阻塞的操作,会明显影响Redis的性能。可以使用增量快照的技术两次RDB快照之间只对修改的数据进行快照,但增量快照的弊端在于需要维护修改数据的位置非常麻烦,所以更合适的方法是通过AOF+RDB快照相结合实现持久化,两次RDB快照之间的修改操作写入日志中,由于两次RDB快照之间不会导致大量的日志,所以恢复AOF日志的结果不会很耗时。

以上就是Redis持久化的两种方式,不知道对大家有没有帮助,也欢迎大家提建议交流!