加入收藏 | 设为首页 | 会员中心 | 我要投稿 天瑞地安资讯网_保定站长网 (https://www.52baoding.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

内存数据库---为什么断电后Redis数据不会丢失

发布时间:2022-10-20 10:57:37 所属栏目:MySql教程 来源:
导读:  作为一款内存数据库,为什么断电后Redis数据不会丢失 前言

  Redis作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其他因素导致Reids服务宕机,在重启之后数据会丢失吗?
  作为一款内存数据库,为什么断电后Redis数据不会丢失 前言
 
  Redis作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其他因素导致Reids服务宕机,在重启之后数据会丢失吗?
 
  Redis 持久化机制
 
  Redis虽然是定义为一个内存数据库,但是其也支持数据的持久化,在Redis中提供了两种持久化机制:RDB持久化和AOF持久化。
 
  RDB 持久化机制
 
  RDB全称为:Redis DataBase,是Redis当中默认的持久化方案。当触发持久化条件时,Redis默认会生成一个dump.rdb文件,Redis在重启的时候就会通过解析dump.rdb文件进行数据恢复。
 
  RDB 机制触发条件
 
  RDB持久化机制有两种触发方式:自动触发和手动触发。
 
  自动触发
 
  自动触发方式也可以分为三种:
 
  手动触发
 
  除了自动触发,Redis中还提供了2个手动触发RDB机制的命令(这两个命令不能同时被执行,一旦一个命令正在执行中,另一个命令会被拒绝执行):
 
  如果想要知道上一次成功执行save或者bgsave命令的时间,可以执行lastsave命令进行查看,lastsave命令返回的是一个unix时间戳。
 
  RDB 机制相关配置文件
 
  除了上面提到的触发生成rdb文件的配置参数,RDB持久化机制还有如下一些相关命令:
 
  RDB 机制优点 RDB 机制缺点 AOF 持久化机制
 
  AOF全称为:Append Only File,是Redis当中提供的另一种持久化机制。AOF采用日志的形式将每个写操作追加到文件中。开启AOF机制后,只要执行更改Redis数据的命令时,命令就会被写入到AOF文件中。在Redis重启的时候会根据日志内容依次执行AOF文件中的命令来恢复数据。
 
  AOF和RDB最大的不同是:AOF记录的是执行命令(类似于MySQL中binlog的statement格式),而RDB记录的是数据(类似于MySQL中binlog的row格式)。
 
  需要注意的是:假如同时开启了RDB和AOF两种机制,那么Redis会优先选择AOF持久化文件来进行数据恢复。
 
  AOF 机制如何开启
 
  AOF机制默认是关闭的,可以通过以下配置文件进行修改
 
  PS:和RDB机制一样,其生成文件的路径也是通过dir属性进行配置。
 
  AOF 机制数据是否实时写入磁盘
 
  AOF机制下数据是否实时写入磁盘,这个和MySQL的redo log机制很类似,也是需要通过参数来进行控制。
 
  AOF数据何时写入磁盘由参数appendfsync来进行控制:
 
  appendfsync描述备注
 
  always
 
  写入缓存的同时通知操作系统刷新(fsync)到磁盘(但是也可能会有部分操作系统只是尽快刷盘,而不是实时刷盘)
 
  Slow, Safest
 
  everysec
 
  先写入缓存,然后每秒中刷一次盘(默认值),这种模式极端情况可能会丢失 1s 的数据
 
  Compromise
 
  no
 
  只写入缓存,什么时候刷盘由操作系统自己决定
 
  Faster
 
  AOF 文件重写
 
  AOF机制主要是通过记录执行命令的方式来实现的mysql持久化,那么随着时间的增加,AOF文件不可避免的会越来越大,而且可能会出现很多冗余命令。比如同一个key值执行了10000次set操作,实际上前面9999次对恢复数据来说都是没用的,只需要执行最后一次命令就可以把数据恢复,正是为了避免这种问题,AOF机制就提供了文件重写功能。
 
  重写原理分析
 
  AOF重写时Redis并不会去分析原有的文件,因为如果原有文件过大,分析也会很耗时,所以Redis选择的做法就是重新去Redis中读取现有的键值对,然后用一条命令记录键值对的值。
 
  只使用一条命令也有一个前提,那就是一个集合键或者列表键或者哈希键内包含的元素不能超过64个,一旦超过64个,就会使用多条命令来进行记录。
 
  AOF 重写缓冲区
 
  AOF重写的时候一般都会有大量的写操作,所以为了不阻塞客户端的命令请求,Redis会把重写操作放入到子进程中执行,但是放入子进程中执行也会带来一个问题,那就是重写期间如果同时又执行了客户端发过来的命令,又该如何保证数据的一致性?
 
  为了解决数据不一致问题,Redis中引入了一个AOF重写缓冲区。当开始执行AOF文件重写之后又接收到客户端的请求命令,不但要将命令写入原本的AOF缓冲区(根据上面提到的参数刷盘),还要同时写 入AOF重写缓冲区:
 
  一旦子进程完成了AOF文件的重写,此时会向父进程发出信号,父进程收到信号之后会进行阻塞(阻塞期间不执行任何命令),并进行以下两项工作:
 
  将AOF重写缓冲区的文件刷新到新的AOF文件内。将新AOF文件进行改名并原子的替换掉旧的AOF文件。
 
  完成了上面的两项工作之后,整个AOF重写工作完成,父进程开始正常接收命令。
 
  AOF 机制触发条件
 
  AOF机制的触发条件同样也分为自动触发和手动触发。
 
  注意:bgrewriteaof命令也不能和上面RDB持久化命令bgsave同时执行,这么做是为了避免同时创建两个子进程来同时执行大量写磁盘操作,影响到Redis的性能。
 
  AOF 机制机制优点 AOF 机制机制缺点 总结
 
  本文主要介绍了Redis的两种持久化机制:RDB和AOF,并分别介绍了两种持久化机制的原理,通过对两种持久化机制的对比分析了两种持久化机制各自的优点和缺点。
 

(编辑:天瑞地安资讯网_保定站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!