{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

Redis 中怎样做持久化?

社区管理员社区管理员 回答1 收藏3
收藏问题

1条回答

社区管理员

社区管理员

回答于2022-10-19 11:53

(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 来进行设置。


评论0 赞同0
  •  加载中...

社区管理员

|打造一个专业,规范,活跃的社区

TA的文章

阅读更多

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<