Redis——持久化数据

Stella981
• 阅读 598

Redis被称为是内存数据库,那是因为它会将其所有数据存储在内存里,因此Redis具有强劲的速度性能,但是,也正因为数据存储在内存中,当Redis重启后,所有存储在内存的数据就会丢失。为了使得数据持久化,Redis提供了两种方式:RDB方式AOF方式

一、RDB方式

RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时,Redis会自动将内存中所有的数据生成一份副本并存储在硬盘中,这个过程被称为“快照”。“快照”,就类似于拍照,摁下快门那一刻,所定格的照片,就称为“快照”。Redis有4种情况会对数据进行快照:

  • 根据配置规则进行自动快照;
  • 用户执行SAVE或BGSAVE命令;
  • 执行FLUSHALL命令;
  • 执行复制(replication)时。

1、根据配置规则进行自动快照

配置文件的自定义信息由两个参数决定:时间窗口M改动的键的个数

如配置:save 900 1

可以配置多个快照条件,每条快照条件都占一行,并且以save开头,上面这条表示900秒内有一个或一个以上的键被修改了,就进行快照。

2、用户执行SAVE或BGSAVE命令

在执行SAVE命令进行手动快照时,快照过程中会阻塞所有来自客户端的请求,当数据库数据比较多时,那么这一过程就会使得客户端等待较长的时间;相对的,执行BGSAVE命令时,则是采用异步快照,在进行快照过程中,依然响应来自客户端的请求。所以,比较常用的是BGSAVE命令。

3、执行FLUSHALL命令

当执行FLUSHALL命令时,Redis会清除数据库的所有数据。值得注意的是,清空数据库过程,相当于修改键,在这个过程中,只要自动快照条件不为空,Redis都会执行一次快照,换句话说,如果没有定义自动快照条件时,即使执行了FLUSHALL命令,也不会进行快照。

4、执行复制(replication)

当设置了主从模式时,Redis会在复制初始化时进行自动快照。这里跟FLUSHALL有区别,执行复制时,即使没有设置自动快照条件,也会进行快照操作,生成RDB格式文件。

快照原理:

Redis默认会将快照文件存储在Redis当前进程的工作目录中的dump.rdb文件中,可以配置 dir和dbfilename两个参数设置快照文件路径。快照过程

(1) Redis使用fork函数复制一份当前进程的副本;

(2) 父进程(这里是当前进程)继续接收并处理客户端发来的命令,而子进程(副本)开始将内存中的数据写入硬盘中临时文件;

(3) 当子进程写完所有数据后,就用临时文件覆盖掉旧的RDB文件,至此,完成一次快照操作。

在fork函数执行的时候,操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的那一刻,父子进程共享同一内存数据,当父进程要更改其中某片数据时,操作系统会将该片数据复制一份,以保证子进程不受影响,所以新的RDB格式文件保存的是执行fork那一刻的内存数据。因为使用了写时复制策略,使得在fork的时刻用了不到2倍的内存,就可以保存貌似两份的内存副本一样。

值得注意的是,当进行快照的过程中,如果写入操作较多,造成fork前后数据差异较大,是会使得内存使用量显著增加,因为内存中不仅保存当前进程的数据,还保存了fork时刻的内存数据。

Redis进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的,这对于数据库备份有一个很好的作用。

二、AOF方式

通过RDB方式实现持久化,一旦Redis异常退出,,就会丢失最后一次快照之后更改的所有数据。为了降低因进程中止导致的数据丢失风险,可以使用AOF方式实现数据持久化。

默认情况下,Redis是没有开启AOF方式的持久化,可以通过appendonly参数启动:appendonly yes

开启AOF持久化后,每执行一条会更改Redis中数据的命令,Redis就会将该命令写入硬盘中的AOF格式的文件,即.aof格式文件存储的是一些redis指令。这个时候就要注意,当频繁操作Redis中的数据时,AOF格式文件所占内存就会越来越大,而且会有很多没用的指令,如连续执行set foo 1,set foo 2,set foo 3,那么前两条指令是没有意义的,Redis很强大,它会自动将没有意义的指令删除,即每当达到一定条件时,Redis就会自动重写AOF文件,而这个条件可以在配置文件中设置。重写的过程只和内存数据有关,和之前的AOF文件无关,这点跟RDB相似。

在同步硬盘数据数据时,由于操作系统的缓存机制,数据并没有真正地写入到硬盘中,而是进入到系统的硬盘缓存。在默认的情况下,系统每个30秒会执行一次同步操作,在这30秒的过程中,如果系统异常退出,那么会导致硬盘内存中的数据丢失。Redis允许同时开启RDB和AOF方式,既保证了数据安全,又使得备份操作十分容易。AOF可以有效降低数据丢失的可能性,RDB可以使得数据备份容易达到。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Redis持久化RDB和AOF实现原理
Redis持久化RDB和AOF为什么Redis需要持久化?因为Redis属于内存型数据库,数据是储存在内存当中的,当遇到不可抗力因素,比如断电,那么储存在内存中的数据就会丢失。所以为了保证数据的完整性,我们需要做持久化操作,来保证数据的完整性。Redis中都有哪些持久化机制?Redis早
Stella981 Stella981
3年前
Redis 的落地策略
因为之前使用redis一般都只做热数据处理,没有考虑过落地方案,因此,通过很多次不同的交流,发现落地也挺重要的,特来学习一般。落地策略我们知道,redis是纯内存数据库,一旦发生宕机,数据就会丢失,因此,Redis的落地策略其实就是持久化(Persistence),主要有以下2种策略:1.RDB:定时快照方式(snapsho
Stella981 Stella981
3年前
Redis 持久化(10)
持久化机制Redis速度快,很大一部分原因是因为它所有的数据都存储在内存中。如果断电或者宕机,都会导致内存中的数据丢失。为了实现重启后数据不丢失,Redis提供了两种持久化的方案,一种是RDB快照(RedisDataBase),一种是AOF(AppendOnlyFile)。RDBRDB是Redis默认的持久化方案。当满足一定条
Stella981 Stella981
3年前
Redis持久化存储详解(一)
为什么要做持久化存储?持久化存储是将Redis存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道Redis是一个基于内存的nosql数据库,内存存储很容易造成数据的丢失,因为当服务器关机等一些异常情况都会导致存储在内存中的数据丢失。持久化存储分类在Redis中,持久化存储分为两种。一种是aof日志追加的方式
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
子非鱼 子非鱼
2年前
Redis高级
第一章Redis的持久化由于redis是一个内存数据库,所有的数据都是保存在内存当中的,内存当中的数据极易丢失,所以redis的数据持久化就显得尤为重要,在redis当中,提供了两种数据持久化的方式,分别为RDB以及AOF,且Redis默认开启的数据持久化方式为RDB方式。1、RDB持久化方案Redis会定期保存数据快照至一个rbd文件中,并在启动时自动
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这