Redis是内存数据库,一旦redis服务关停,内存中的数据都会被清空,所以 内存数据库 提供了数据落地的策略
Redis中持久化策略有两个 RDB 和 AOF
RDB:
首先指定把数据保存到哪个地方 config set dir E: 设置保存文件夹, config set dbfilename dumb.rdb 设置保存文件
RDB可以手动用 bgsave触发(会启用一个子线程来处理,不会block主线程处理其他命令,就用这个吧)
也可以被动触发save m n 表示在m 秒内发生了n次数据变更 会触发一次存储,实际也用的是bgsave
RDB文件,会在Redis启动时自动加载,但是AOF模式的优先级更高,所以会先载入AOF文件,只有AOF模式关闭的情况(redis加载数据完成不会再载入另一个落地库),才会检测RDB的文件,用RDB载入会阻塞
AOF:
Redis服务器默认使用RDB模式,AOF需要在配置文件中开启 appendonly yes
AOF模式支持 3 种写入模式
append -- Redis先将写命令追加到缓冲区,而不是直接写入文件,主要是为了避免每次有写命令都直接写入硬盘,导致硬盘IO成为Redis负载的瓶颈。
文件写入(write)和文件同步(sync):
AOF缓存区的同步文件策略由参数appendfsync控制,各个值的含义如下:
- always:命令写入aof_buf后立即调用系统fsync操作同步到AOF文件,fsync完成后线程返回。这种情况下,每次有写命令都要同步到AOF文件,硬盘IO成为性能瓶颈,Redis只能支持大约几百TPS写入,严重降低了Redis的性能;即便是使用固态硬盘(SSD),每秒大约也只能处理几万个命令,而且会大大降低SSD的寿命。
- no:命令写入aof_buf后调用系统write操作,不对AOF文件做fsync同步;同步由操作系统负责,通常同步周期为30秒。这种情况下,文件同步的时间不可控,且缓冲区中堆积的数据会很多,数据安全性无法保证。
- everysec:命令写入aof_buf后调用系统write操作,write完成后线程返回;fsync同步文件操作由专门的线程每秒调用一次。推荐
rewirte -- 文件重写是指定期重写AOF文件,减小AOF文件的体积
RDB文件紧凑,体积小,网络传输快,适合全量复制;恢复速度比AOF快很多。当然,与AOF相比,RDB最重要的优点之一是对性能的影响相对较小。
与RDB持久化相对应,AOF的优点在于支持秒级持久化、兼容性好,缺点是文件大、恢复速度慢、对性能影响大。