Redis持久化机制本平台不定时更新,喜欢我的文章,请关注我的微信公众号。上一篇文章主要讲述了Redis的内存淘汰机制以及Redis容易引发的三大问题:缓存击穿、缓存穿透、缓存雪崩。详细讲解并提供了业界通用的解决方案。本文主要讲Redis的持久化机制。Redis受到开发人员欢迎的原因之一是因为它具有持久化的特性。如何保证Redis宕机重启后能够恢复数据呢?所以一般情况下,我们需要坚持定时将内存中的数据写入硬盘。Redis支持两种不同的持久化机制:RDB持久化和AOF持久化。快照持久化是全量备份,备份是内存数据的二进制序列化格式。AOF持久化是增量备份,记录内存数据修改的指令记录文本。所以AOF持久化产生的日志会随着运行时间变长而越来越臃肿。每次重启Redis都需要加载AOF日志进行命令重放,所以需要定期重写AOF日志进行瘦身操作。SnapshotPersistence(RDB)RDB持久化是指在指定的时间间隔内,将内存中数据集的快照写入磁盘。实际操作过程是fork一个子进程,由于OS的Copy-on-write机制,子进程负责将数据集写入临时文件,父子进程会共享同一个物理接口。当父进程处理一个写请求时,OS会为父进程创建一个页面副本,所以紫禁城地址空间中的数据实际上是一个快照。写入成功后,将替换之前的页面。文件,以二进制压缩方式存储。RDB是Redis默认的持久化方式。相应目录下会生成dump.rdb文件,重启后加载dump.rdb文件恢复数据。Redis利用操作系统的多进程COW机制来实现RDB持久化。优点:只有一个备份文件,dump.rdb,方便持久化备份;容灾性好,一个文件可以保存到其他存储介质上;性能最大化,fork一个子进程完成写操作,让主进程继续处理命令,所以就是IO最大化(使用单独的子进程进行持久化,主进程不会进行任何IO操作,这保证redis的高性能);如果数据集太大,RDB的启动效率会比AOF高。缺点:数据安全性低。如果数据集很大,可能会导致整个服务器停止服务。RDB持久化是Redis默认采用的持久化方式,可以在redis.conf配置文件中进行配置。N秒内修改超过M个key,Redis会自动做快照:save9001:15分钟内,如果至少有一个key发生变化,Redis会自动触发BGSAVE命令创建快照。save30010:5分钟内,如果至少有10个key发生变化,Redis会自动触发BGSAVE命令创建快照。save6010000:1分钟后,如果至少有10000个key发生变化,Redis会自动触发BGSAVE命令创建快照。AOF持久化AOF持久化就是以日志的形式记录每次的增删改查操作,所有的增删改查都会通过write函数追加到文件中。AOF的出现是为了弥补RDB的不足(数据不一致),所以它采用日志的形式来记录每一次写操作,并追加到文件中。Redis重启通过执行保存在文件中的写命令在内存中重建整个数据库的内容。与快照持久化相比,AOF持久化具有更好的实时性,因此成为主流的持久化方案。Redis默认不开启AOF持久化,可以通过设置appendonly参数开启:appendonlyyesRedis通过fork生成子进程,子进程根据快照中的快照将重建数据库状态的命令写入临时文件内存,父进程继续处理请求,子进程将快照内容写入临时文件时,向父进程发送信号,将缓存中的写操作写入临时文件,最后替换使用临时文件复制旧备份文件并重命名它。AOF文件的保存位置与RDB文件相同,均由dir参数设置,默认文件名为appendonly.aof。Redis配置文件中存在三种不同的AOF持久化方式,分别是:appendfsyncalways:每次发生数据修改时写入AOF文件appendfsynceverysec:每秒同步一次,同步多个写入命令到硬盘appendfsyncno:让操作系统决定何时同步。用户可以使用appendfsynceverysec选项让Redis每秒同步一次AOF文件,这样Redis的性能几乎不会受到影响,即使出现宕机,用户最多也只会丢失一秒内产生的数据。当硬盘忙于执行写操作时,Redis也会优雅地放慢速度以适应硬盘的最大写入速度。优点:数据安全性更高,AOF持久化可以配置appendfsync属性通过append方式写入文件,即使中途宕机也可以使用redis-check-aof工具解决数据一致性问题。AOF机制的rewrite模式。缺点:AOF文件比RDB文件大,恢复速度慢;当数据集很大时,启动效率低于RDB。根据不同的同步策略,AOF在运行效率上往往比RDB慢。对于Redis的两种持久化机制的选择,主要针对具体的系统进行讨论,看是否可以牺牲一定的性能,使用AOF持久化来换取缓存的一致性,或者在增删改查时关闭备份比较频繁,等Redis空闲了再手动保存做RDB持久化备份。所以其实最好的方案应该是采用混合持久化方案。开启混合持久化后,AOF重写日志时,会将RDB持久化的内容写入AOF文件的开头。因此,当Redis重启时,可以先加载RDB内容。然后重放增量AOF日志,提高Redis重启效率。欢迎关注公众号:程序员周先森。本文由博客多发平台OpenWrite发布!
