一、什么叫持久化?
用一句话可以将持久化概括为:将数据(如内存中的对象)保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、 XML 数据文件中等等。
从应用层与系统层理解持久化
同时,也可以从应用层和系统层这两个层面来理解持久化:
应用层:如果关闭( Close )你的应用然后重新启动则先前的数据依然存在。
系统层:如果关闭( Shutdown )你的系统(电脑)然后重新启动则先前的数据依然存在。

二、Redis 为什么要持久化?
Redis 中的数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。与 Memcached 一样,为了保证效率,数据都是缓存在内存中。
由于数据都是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据都会消失殆尽,再也找不回来了。所以,为了让数据能够长期保存,就要将 Redis 放在缓存中的数据做持久化存储。

三、Redis 怎么实现持久化?
在设计之初,Redis 就已经考虑到了这个问题。官方提供了多种不同级别的数据持久化的方式:
1、RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。
2、AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。
3、如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。
4、你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
如果你不知道该选择哪一个级别的持久化方式,那我们就先来了解一下 AOF 方式和 RDB 方式有什么样的区别,并且它们各自有何优劣,学习完之后,再来考虑该选择哪一种级别。

四、快照技术
快照(Snapshot)是某个数据集在某一特定时刻的镜像,也称为即时拷贝,它是这个数据集的一个完整可用的副本。存储网络行业协会SNIA对快照的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本(duplicate),也可以是数据的一个复制品(replicate)。
照技术主要分为镜像分离(split mirror) 、改变块(changed block)、 并发(concurrent) 三大类。后两种在实现时通常使用指针重映射(pointer remapping)和写时拷贝(copy on write)技术。changed block 方式的灵活性及使用存储空间的高效性,使得它成为快照技术的主流。
第一种快照是镜像分离(split mirror)。在即时拷贝之前构建数据镜像,当出现一个完整的可供复制的镜像时,就可以通过瞬间“分离”镜像来产生即时拷贝。这种技术的优点是速度快,创建快照无须额外工作。但缺点也很显明,首先它不灵活,不能在任意时刻进行快照;其次,它需要一个与数据卷容量相同的镜像卷;再者,连续地镜像数据变化影响存储系统的整体性能。

第二种快照是改变块(changed block)。快照创建成功后,源和目标共享同一份物理数据拷贝,直到数据发生写操作,此时源或目标将被写向新的存储空间。共享的数据单元可是块、扇区、扇道或其他的粒度级别。为了记录和追踪块的变化和复制信息,需要一个位图(bitmap),它用于确定实际拷贝数据的位置,以及确定从源还是目标来获取数据。(主流快照技术)

第三种快照是并发(cocurrent)。它与改变块非常相似,但它总是物理地拷贝数据。当即时拷贝执行时,没有数据被复制。取而代之,它创建一个位图来记录数据的复制情况,并在后台进行真正的数据物理复制。