Redis6.x学习笔记(二)持久化之RDB
前言
最近学习Redis6.x,特做笔记以备忘,与大家共学。课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值得学习!关键是不要钱,嘻嘻!
Redis持久化概述
Redis持久化分成三种方式:RDB(Redis DataBase)、AOF(Append Only File)和AOF+RDB混合持久化
关于Redis持久化,有这么一些说法:
1:RDB是在不同的时间点,将Redis某一时刻的数据生成快照并存储到磁盘上
2:AOF是只允许追加不允许改写的文件,是将Redis执行过的所有写指令记录下来,在下次Redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了
3:混合方式是先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作
4:RDB和AOF两种方式可以同时使用,在这种情况下,如果Redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高
5:可以关闭RDB和AOF,这样的话,Redis将变成一个纯内存数据库,就像Memcache一样
6:通过配置redis.conf中的appendonly为yes就可以打开AOF功能
7:通过 aof-use-rdb-preamble 配置项可以打开混合方式
RDB方式概述
RDB方式,Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
RDB的配置
1:save * :保存快照的频率,第一个表示多长时间,单位是秒,第二个*表示至少执行写操作的次数;在一定时间内至少执行一定数量的写操作时,就自动保存快照;可设置多个条件。
(1)如果想禁用RDB持久化的策略,只要不设置任何save指令,或者给save传入一个空字符串参数也可以
(2)如果用户开启了RDB快照功能,那么在Redis持久化数据到磁盘时如果出现失败,默认情况下,Redis会停止接受所有的写请求。这样做的好处在于可以让用户很明确的知道内存中的数据和磁盘上的数据已经存在不一致了。如果下一次RDB持久化成功,redis会自动恢复接受写请求。
2:dbfilename:数据快照文件名(只是文件名,不包括目录),默认dump.rdb
3:dir:数据快照的保存目录(这个是目录),默认是当前路径
4:stop-writes-on-bgsave-error:如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制这种不一致,那么在快照写入失败时,也能确保redis继续接受新的写请求
5:rdbcompression:对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能
6:rdbchecksum:在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
7:rdb-del-sync-files:在没有持久性的情况下删除复制中使用的RDB文件启用。默认情况下,此选项是禁用的。
RDB的问题
1:fork一个进程时,内存的数据也被复制了,即内存会是原来的两倍
2:每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
3:由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
触发快照的情况
1:根据配置规则进行自动快照
2:用户执行save或bgsave命令
3:执行flushall命令
4:执行复制replication时
save命令
执行Save命令时,Redis会阻塞所有客户端的请求,然后同步进行快照操作。
bgsave命令
执行bgsave命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave命令获取最后一次成功执行快照的时间。
flushall命令
这个命令会导致Redis清除内存中的所有数据,如果定义了自动快照的条件,那么无论是否满足条件,都会进行一次快照操作;如果没有定义自动快照的条件,那么不会进行快照
后记
我会持续的把我学习Redis6.x过程的笔记记录下来,跟大家一起学习。希望能坚持下去!