Redis持久化
Redis持久化
RDB方式
当符合条件时Redis自动将内存中的所有数据生成一份副本存储在硬盘上
根据配置规则进行自动快照
Redis允许用户在配置文件中自定义配置规则
所有的条件时或关系,例如第一条的意思是900秒内有一个或一个以上的键被更改则执行快照。
用户执行save或bgsave命令
当我们需要对服务器进行重启、备份、迁移等操作时也会需要手动进行备份操作。
save命令
save命令会使Redis同步的执行快照操作,在进行快照的过程中会阻塞所有客户端的请求,当备份较多数据时会导致Redis在很长一段时间中不响应。
flushall命令
只要快照的执行条件不为空,则Redis会进行一次快照操作,然后清空Redis数据库中的所有数据,如果没有快照条件则直接清空。
bgsave命令
bgsave命令还可以在后台异步的执行快照操作,执行快照的同时,Redis还可以响应客户端的请求。
步骤:
- Redis使用fork函数复制一份当前进程的副本交给子进程(在进行fork操作时,操作系统会使用写时复制(copy_on_write)策略,在fork时子进程和主进程将会共享同一内存数据,当主进程需要进行更改某片诗句时,会将该片数据复制一份,保证修改时子进程的快照不受影响。写时复制策略保证了在fork时内存的占用量不会增加一倍,但是如果在快照时,客户端传来大量的更改请求也有可能导致内存溢出)
- Redis继续接收并处理客户端发来的请求,子进程开始将进程的副本写入硬盘的临时文件中
- 当子进程执行完快照后,会使用临时文件将旧的RDB文件替换掉。
save和bgsave对比
save为同步进程,bgsave为异步进程。各有优劣,在Redis存储的数据量只有几个GB的时候,使用bgsave是没有问题的,但是随着Redis占用的内存越来越多,bgsave在创建子进程耗费的时间也会越来越长,并且和主进程抢占资源,导致Redis性能低下无法使用,此时save执行的速度将会远快于bgsave,例如可以选择写一个脚本在凌晨进行save保存,对应用程序的影响较小。
RDB方式总结
通过RDB方式持久化,一旦Redis异常退出,所丢失的就是最后一次快照后所修改的数据。RDB快照文件是经过压缩的,所以它占用的空间会小于内润中的数据大小,更有利于传输。
AOF方式
AOF方式是将Redis执行的每一条命令都追加到硬盘文件中,会稍微影响Redis的性能,使用SSD可以提高AOF的性能。
开启方式
在配置文件中设置为yes即可
实现原理
当Redis每执行一条命令时,AOF机制都会将命令追加进硬盘文件中,但是由于操作系统的缓存机制,数据并没有真正的被写到磁盘,而是进入了系统硬盘的缓冲区中,默认情况下系统每30秒执行一次同步操作,此时才真正将内容写入了磁盘,但是在这30秒内系统出现异常退出将会导致缓存中的数据丢失,Redis在配置文件中提供了如下策略:
always 每个Redis写命令都要同步的写入磁盘
everysec 每秒执行一次同步,显式地将多个写命令同步到磁盘
no 由操作系统默认同步
- always 方式会严重影响Redis的性能,因为它的每个写命令都需要写入硬盘,Redis处理命令的速度会受到硬盘性能的限制,转式硬盘每秒大约200个命令,固态硬盘每秒几万个命令。并且可能会影响固态硬盘的寿命(写入放大)
- everysec 是默认策略,对Redis的性能机会没有影响,即使出现问题丢失的也是一秒内的数据。
- no 由操作系统来决定何时进行AOF同步,一般不会影响Redis的性能,但是一旦出现故障丢失的数据量是不可控的,当硬盘写入速度不够快,缓冲区被填满时,Redis会被阻塞Redis的写请求,导致Redist的处理变慢。
AOF文件自动优化
那么问题来了 如果执行了三条命令如下:
set name 1
set name 2
set name 3
Redis会将这三条命令全部写入AOF文件中,但是前两条命令都会被第三条覆盖,所以前两条是冗余命令,随着命令越来越多,AOF文件也会越来越大,而Redis中可能并没有多少数据。Redis对此问题有专门的优化机制。每达到一定条件时Redis会自动重写AOF文件,这些条件可以在配置文件中自定义。auto-aof-rewrite-percentage 100 表示当前的AOF文件超过上一次重写时的AOF文件大小百分之100时会再次重写 auto-aof-rewrite-min-size 64mb 限制了重写的最小AOF文件大小
AOF文件手动优化
手动执行bgrewriteaof命令进行AOF重写。
AOF重写的性能问题
AOF的重写与bgsave十分相似,都需要启动一个子线程,在AOF文件庞大时,子线程也会与主线程抢占资源,出现性能问题,所以需要进行上述的配置,用以控制AOF文件的体积大小,过于频繁的回收会影响系统性能,反之会导致AOF文件体积过大,需要在实际使用中进行调试。