持久化介绍
Redis 的数据都存放在内存中,如果没有配置持久化,redis 重启后数据就全丢失,于是需要开启 redis 的持久化功能,将数据保存到磁盘上,当 redis 重启后,可以从磁盘中恢复数据。
Redis持久化方式:
- RDB持久化:方式能够在指定的时间间隔对你的数据进行快照存储。
- AOF持久化方式:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。
RDB方式:
客户端直接通过命令BGSAVE或者SAVE来创建一个内存快照
- BGSAVE调用fork来创建一个子进程,子进程负责将快照写入磁盘,而父进程仍然继续处理命令。
- SAVE执行SAVE命令过程中,不再响应其他命令(会阻塞其他命令)。
在redis.conf中调整save配置选项,当在规定的时间内,Redis发生了写操作的个数满足条件会出发发生BGSAVE命令:
#900秒之内至少一次写操作
save 900 1
#300秒之内至少发生10次写操作
save 300 10
#60秒之内发生至少10000次
save 60 10000
RDB 优点和缺点:
优点:对性能影响最小(以异步的形式保存信息)、RDB文件进行数据恢复比使用AOF要快很多。
缺点:同步时丢失数据(因为根据时间间隔和发生写操作的次数保存)、如果数据集非常大且CPU不够强(比如单核CPU),Redis在fork子进程时可能会消耗相对较长的时间,影响Redis对外提供服务的能力。
AOF 持久化方式:
开启AOF持久化,redis.conf中调整,默认是不开启的。
appendonly yes
#AOF策略调整
#每次有数据修改发生时都会写入AOF文件
appendfsync always
#每秒钟同步一次,该策略为AOF的缺省策略
appendfsyn everysec
#从不同步。高效但是数据不会被AOF持久化
appendfsync no
AOF 优点和缺点:
优点:最安全、容灾处理安全、易读,可修改
缺点:文件体积大(每次命令处理都保存)、性能消耗比RDB高(执行频次高)、数据回复速度比RDB慢
模拟RBD持久化快照保存:
在redis.conf中修改RDB快照的间隔时间和次数,这里修改的是3秒有2次操作就会保存一次快照,实际是redis每隔3秒就会去检查操作次数,如果大于2则会操作一次BGSAVE。
3秒内快速操作Redis
日志打印,BGSAVE调用fork来创建一个子进程子进程负责将快照写入磁盘,这里显示子进程号:16310
RDB快照保存缺点演示:
操作一次Redis,这里显示b已经被保存
操作一次Redis服务挂掉,然后重启服务:
重新获取b,数据丢失,因为RDB是根据时间间隔和发生写操作的次数保存,这里的b还没有保存就被kill掉了,重启后redis重新加载RDB文件,里面没有b的保存数据。
如果Redis是正常关闭,不是被kill掉,则会在退出的时候进行一次RDB快照保存。
模拟AOF持久化保存:
在redis.conf中打开aof持久化保存配置,配置每秒同步一次数据到aof文件。
执行操作:
打开保存数据持久化的文件aof,这里的数据我们是可以看明白的,并且可以去修改他,kill -9 掉程序,重启之后仍然可以获取到值