Redis 是一个键值对数据库服务器。基于内存存储数据,它常被用做缓存数据库,用来替代 memcached。官网:https://redis.io/

什么是持久化?

持久化,指将数据存储到可永久保存的设备中。
例如,将内存中的数据存储到可永久保存的硬盘中。

为什么需要持久化?

  1. Redis 基于内存存储,内存掉电后数据会丢失
  2. 内存比硬盘贵得多,所以需要将一些不能丢失的数据持久化到硬盘上

甚至,一些特别重要的数据,是需要存到 MySQL 的。
Redis 本身有持久化,为什么还要写进 mysql 呢?:https://www.v2ex.com/t/219551

如何做持久化?

Redis 提供了四种持久化方式:

  1. RDB(Redis database|Snapshoting)
  2. AOF(Append-Only file)
  3. VM(虚拟内存)被淘汰了
  4. Diskstore 不了解

这次主要说的是 RDB 和 AOF 两种持久化方式。

RDB 持久化

RDB:Redis database 的简称。一看这个,你就应该能猜到,这是 Redis 的默认持久化方式。

RDB 中持久化生成的是一个经过压缩的二进制文件。

RDB 持久化时机:

  1. 在客户端执行 SAVE 或者 BGSAVE
  2. 根据配置规则自动快照(稍后会讲到)
  3. 执行 FLUSHALL 命令
  4. 执行复制(replication)

RDB 持久化步骤:

  1. fork 复制出一个父进程的副本子进程
  2. 子进程将内存中的数据写入到硬盘中的临时文件
  3. 将临时文件替换旧的 rdb 文件

自动间隔保存(配置规则):

save 900 1     # 每900秒检查一次,如果有1条数据修改了,那么执行 rdb
save 300 10    # 每300秒检查一次,如果有10条数据修改了,那么执行 rdb
save 60 10000  # 每60秒检查一次,如果有10000条数据修改了,那么执行 rdb

RDB 文件还原

服务器启动时,会直接载入 RDB 文件。
但是如果 AOF 文件存在,则会载入 AOF 文件。AOF 文件载入过程会在后文中描述

AOF 持久化

AOF 是 Append Only File 的简称。

AOF 通过保存客户端传过来的写命令来记录数据库的状态。
如:

$3(后面是 \r\n)
SET
$3
msg
$1
5
$3
SET
$3
msg
$1
3

AOF 持久化的时机

需要在配置文件中加入:

appendonly yes

AOF 持久化的步骤

主进程进行如文章末尾所示的三个步骤:

  1. 命令追加
  2. 文件写入
  3. 文件同步

AOF 重写的时机

  1. 配置:
# 当前 AOF 文件超过上次重写时的 AOF 文件大小的百分之多少时再次进行重写
# 如果之前没有冲写过,则以启动时的 AOF 文件大小为依据。
auto-aof-rewrite-percentage 100
# 允许重写的最小值
auto-aof-rewrite-min-size 64mb
  1. 主动执行 BGREWRITEAOF 命令触发 AOF 重写。

AOF 重写步骤

如果是在客户端直接执行 REWRITEAOF ,会阻塞服务,直到重写完成,将新的 AOF 文件覆盖旧的文件。这种方式一般不会考虑。

BGREWRITEAOF 命令的执行过程如文末图片所示:

  1. 父进程写入 AOF 缓冲区和 AOF 重写缓冲区
  2. 子进程执行 AOF 重写,完成之后发送信号给父进程
  3. 父进程收到信号将 AOF 重写缓冲区的内容写入到新的 AOF 文件中,并且覆盖原有的 AOF 文件

AOF 重写是将多条命令用一条命令代替。
如上面代码所示,存储一个 msg 使用了两条命令。经过 AOF 文件重写之后,就会变成如下所示,大大减少了使用的存储空间:

$3
SET
$3
msg
$1

AOF 文件还原

AOF 文件还原的步骤如下:

  1. 创建一个伪客户端(fake client)
  2. 从 AOF 文件中分析并读取一条写命令
  3. 使用伪客户端执行写命令
  4. 一直重复步骤 2 和 3

AOF 写入与重写过程图:

redis 是如何做持久化的的更多相关文章

  1. redis做持久化的两种方式,RDB、AOF讲解

    redis的两种持久化方式: 1.RDB方式 概念:在指定的时间间隔内保存数据快照 实现方式: 找到redis的安装目录,修改redis的配置文件(redis.conf):① 修改备份的时间间隔:sa ...

  2. Redis怎么做持久化

    1.redis持久化的两种方式 2.两种持久化方式区别 3.两种持久化方式的使用场景 1.Redis 是内存型数据库,一般来用作缓存.保存在内存的数据有一个特点, 就是断电消失,因此一旦 Redis ...

  3. Redis系列三之持久化

    一.Redis持久化 Redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到磁盘来保证持久化. redis提供了不同级别的持久化方法: Snapshotting(快照,默认方式 ...

  4. Redis教程(十):持久化详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/137.html 一.Redis提供了哪些持久化机制: 1). RDB持久化 ...

  5. [转载] redis 的两种持久化方式及原理

    转载自http://www.m690.com/archives/371 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串 ...

  6. Redis的两种持久化方式-快照持久化和AOF持久化

    Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为"持久化"效 ...

  7. 第一章· Redis入门部署及持久化介绍

    Redis简介 Redis安装部署 Redis持久化 Redis简介 软件说明: Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品. ...

  8. Redis(四)-持久化

    1.Redis将所有数据存储在内存中,从内存同步到磁盘上,就做持久化过程. 2.持久化有两种方式:rdb(Redis Database)和aof(Append of file) # rdb持久化方法: ...

  9. Spring+Redis集成+关系型数据库持久化

    本篇文章主要介绍了"Spring+Redis集成+关系型数据库持久化",主要涉及到Spring+Redis集成+关系型数据库持久化方面的内容,对于Spring+Redis集成+关系 ...

随机推荐

  1. WPF 自定义的图表(适用大量数据绘制)

    原文:WPF 自定义的图表(适用大量数据绘制) 在WPF中绘制图表比较简单,有很多的第三方控件,但是在绘制大量数据的时候,就显得有些吃力,即便是自己用StreamGeometry画也达不到理想的效果, ...

  2. Mac安装jupyter(原ipython)方法

    用了Mac之后非常不习惯,很多东西都要查才能完成=-=之前Python用的sublime和ide,今天看教程安利了一个jupyter 记录下用Mac安装jupyter的过程: 1.像其他安装Mac自带 ...

  3. css3 hover平滑过渡效果,鼠标经过元素,背景渐隐渐现效果

    下面实例,演示,鼠标经过时,改变div宽度,平滑改变,带动画 div { width:100px; height:100px; background:blue; transition:width 2s ...

  4. FTPHelper

    转载自 :https://blog.csdn.net/jiankunking/article/details/50016043 using System; using System.Collectio ...

  5. 【图文教程】de4dot实战字符串解密(演示:hishop微分销系统)

    原文:[图文教程]de4dot实战字符串解密(演示:hishop微分销系统) 前些日子,公司需求开发一个微分销系统,于是找来hishop微分销系统想借鉴一下,没想到里面各种加密,就连字符串也都加密了. ...

  6. iOS判断当前时间是否处于某个时间段内

    /** * 判断当前时间是否处于某个时间段内 * * @param startTime 开始时间 * @param expireTime 结束时间 */ - (BOOL)validateWithSta ...

  7. Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...

  8. 微信小程序把玩(三十五)Video API

    原文:微信小程序把玩(三十五)Video API 电脑端不能测试拍摄功能只能测试选择视频功能,好像只支持mp4格式,值得注意的是成功之后返回的临时文件路径是个列表tempFilePaths而不是tem ...

  9. A simple in-process HTTP server for UWP

    原文 http://www.dzhang.com/blog/2012/09/18/a-simple-in-process-http-server-for-windows-8-metro-apps 简单 ...

  10. 在Visual Studio2015中使用单元测试

    所谓的单元测试(Unit Test),就是对软件的一些模块进行测试以检查其正确性和可靠性,这些模块可以是一个类或者是一个方法等.在Visual studio中,这十分容易实现. 打开Visual st ...