{eval=Array;=+count(Array);}
(1)在 Redis 实现持久化有两种方式:AOF 日志 和 RDB 快照;
(2)AOF 日志
◆ 命令执行成功后,才记录日志;
◆ 命令执行后进行日志记录,不会堵塞当前的写操作。
◆ 命令执行完,日志记录前宕机,数据会丢失;
◆ AOF 日志在主线程中执行,有 IO 瓶颈时会对后面的操作有堵塞风险;
◆ 数据量比较大的时候,恢复很慢。
◆ 配置项(appendfsync)
◆ Always,同步写回磁盘:每个写命令执行完,立即同步将日志写回磁盘;
◆ Everysec,每秒写回磁盘:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;
◆ No,操作系统控制的写回磁盘:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。
(3)RDB 快照
◆ 和 AOF 相比较,RDB 快照记录的是某一个时刻的数据,数据恢复是直接将 RDB 文件读入内存,速度很快;
◆ 生成 RDB 文件的两种方式:
◆ save:在主线程中执行,会导致阻塞;
◆ bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。子进程是由主线程 fork 生成的,可以共享主线程的所有内存数据。
◆ RDB 快照的间隔时间不宜设置过短,因为频繁进行 Redis 的全量快照,会带来性能问题:
◆ 前一个快照还没做完,后面一个开始了,会给磁盘带来压力;
◆ bgsave 的子进程虽然不会阻塞主线程,但创建的过程会阻塞,频繁创建也会带来性能问题。
◆ 解决上面问题的一种办法就是使用增量快照;
◆ 在 Redis 4.0 中提出了一种混合 AOF 日志和 RDB 快照的方式:
◆ RDB 快照的间隔时间可以设置比较大,就不会影响到主线程的操作;
◆ 在快照的间隔期间可以使用 AOF 日志记录所有的操作,当下一次做全量 RDB 快照的时候,清空 AOF 日志;
◆ 通过 aof-use-rdb-preamble yes 来进行设置。
1
回答1
回答1
回答0
回答0
回答0
回答5
回答0
回答0
回答0
回答