redis是一个内存型数据库,这就意味着,当主机重启或者宕机时,内存中的数据会被清空,redis可能会丢失数据。为了保存数据,实现数据持久化就必须要有一种机制,可以将redis数据库的数据保留在硬盘上,在下次使用前再读回内存,这种机制就叫做redis的持久化。在redis中实现这种机制的有两个方法,RDB和AOF。

1.RDB

1.1 RDB原理

  RDB又叫做快照(RDB snapshhot)是一种全量备份,用二进制序列化形式存储内存数据,其存储结构十分紧凑。由于redis的单线程属性,不能在执行主程序时进行I/O操作,而快照又必须进行I/O操作。因此在redis中快照的实现使用了多进程的COW(copy and write)机制来实现。在持久化时调用glibc函数fork(增加分支)一个子进程,将持久化任务甩给子进程来处理,父进程继续进行客户请求处理。子进程只复制其产生的一瞬间的内存数据,与此时父进程的修改操作无关,因而redis的这种持久化又叫做快照。

1.2 RDB使用

  redis的RDB是默认开启的。关闭RDB需要找到redis.conf文件,关闭RDB需要找到redis.conf文件,其中SNAPSHOTTING模块默认配置如下:

#   save ""
save 900 1
save 300 10
save 60 10000

要关闭时将第一行的注释取消,将剩下几行注释掉。

  形如save sec times配置是指当redis在sec秒内修改了数据times次时触发RDB。开启时达到触发条件后在硬盘上会生成一个.rdb文件,这个就是快照产生的数据,文件名可通过修改配置文件dbfilename dump.rdb语句来完成,文件路径修改dir ./语句,注意dir后面所跟的是不包括文件名的路径。

2.AOF

2.1 AOF原理

  AOF日志存储了redis服务器的顺序指令序列,且只记录修改操作。redis通过在重启后重放AOF日志中的指令来完成持久化。当服务器收到修改指令操作后会进行指令的参数检验、逻辑处理,确保没有问题后才会写入AOF日志,保证存储的指令都是正确的。这也就意味着当服务器运行时间相当长之后,AOF日志会非常的大,因此必须定期进行AOF的瘦身(重写)。

  redis提供了bgrewriteaof指令来对AOF日志进行瘦身,其原理就是开辟一个子进程对内存进行遍历,转换成一系列redis操作指令,序列化到一个新的AOF日志文件中。当序列化结束后再操作过程中发生的AOF增量追加到新的AOF日志文件中,追加完毕就立即用新日志文件代替旧的日志文件,瘦身就完成了。

  在生产环境下,AOF的操作通常是1s写一次,因为这个操作是I/O操作因而速度很慢,如果改为只让系统决定何时同步磁盘会导致数据安全性下降,而当改为每次修改指令就触发一次会导致速度很慢。

2.2 AOF使用

  AOF默认是关闭的,可以通过将配置文件APPEND ONLY MODE模块下appendonly no语句中的no改为yes来开启,修改:appendfilename "appendonly.aof"语句修改文件名。触发策略有以下3种:

# appendfsync always

appendfsync everysec

# appendfsync no

默认每秒钟写一次,第一行表示每次写操作都立刻写入到aof文件。第3行表示不要立刻刷,只有在操作系统需要刷的时候再刷。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

上面两个配置是redis的重写策略,第一行表示当AOF日志的大小达到指定百分比(对比上次重写时AOF文件的大小),Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。第二行表示达到指定大小就重写。

3.混合持久化

  重启redis服务时,由于重写策略的缘故,RDB至少5分钟才会重写一次,因此可能会丢失大量的数据,而采用AOF持久化又会导致文件体积过大,所以在redis4.0之后采用了混合策略来实现持久化。

其实现原理为当redis重启时,先加载rdb的内容,然后在重放增量AOF的日志,使得重启效率大幅提升。开启混合持久化需要在配置文件中配置两个地方:

appendonly yes
aof-use-rdb-preamble yes

Redis学习笔记03-持久化的更多相关文章

  1. Redis学习笔记9--Redis持久化

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式:二是Appen ...

  2. Redis学习笔记(一)-持久化

    一.RDB持久方式 RDB持久化是把当前进程的数据已快照的形式保存到硬盘的过程. 触发方式: 1.手动触发命令:save和bgsave save:阻塞式,内存较大的实例在执行过程中会造成长时间的阻塞, ...

  3. redis学习笔记-03:redis安装

    一.redis的安装和配置 1.下载redis-5.0.4.tar.gz到/opt目录下,解压命令 :tar -zxvf redis-5.0.4.tar.gz,解压后出现redis-5.0.4的文件夹 ...

  4. Redis:学习笔记-03

    Redis:学习笔记-03 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 7. Redis配置文件 启动 ...

  5. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

  6. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  7. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

  8. Redis学习笔记(1)——Redis简介

    一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...

  9. redis学习笔记(3)

    redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...

  10. Redis学习笔记(二) Redis 数据类型

    Redis 支持五种数据类型:string(字符串).list(列表).hash(哈希).set(集合)和 zset(有序集合),接下来我们讲解分别讲解一下这五种类型的的使用. String(字符串) ...

随机推荐

  1. JS 变量的数据类型转换

    变量的类型转换,一般情况是JS自动转换的,但也有些时候需要手动转换. 1.其它类型转成布尔型 函数和方法的区别 Boolean(a)  //函数是可以独立使用的 document.write(a)   ...

  2. 关于type return to continue,or q <return> to quit

    由于GDB要打印的信息被分页了 所以需要设置不分页显示 set pagination off

  3. linux 2.6 内核的移植

    内核移植过程   下载 linux 内核 从 http://www.kernel.org/pub/linux/kernel/v2.6/linux­2.6.14.1.tar.bz2 下载 linux­2 ...

  4. drupal-note2 drush运行make文件

    进入durpal项目的根目录中执行 drush make build-openpublic.make /path/to/webroot 参考: Managing Drush make files fo ...

  5. jQuery实现contains方法不区分大小写的方法教程

    jQuery.expr[':'].Contains = function(a, i, m){ return jQuery(a).text().toUpperCase() .indexOf(m[3].t ...

  6. Ubuntu下安装和配置Apache2,小编觉得挺不错的,现在就分享给大家

    本篇文章主要介绍了详解Ubuntu下安装和配置Apache2,小编觉得挺不错的,现在就分享给大家,也给大家做个参考.有兴趣的朋友可以了解一下.(http://xz.8682222.com) 在Ubun ...

  7. Python3基础笔记_字符串类型

    # 1.Python转义字符 a = "sqwerdf" # 2.Python字符串运算符 ''' + 字符串连接 a + b 输出结果: HelloPython * 重复输出字符 ...

  8. Python-匿名函数与异常处理

    目录 匿名函数 什么叫匿名函数? 语法 max/min() sorted() map() filter() reduce函数 内置函数 面向过程编程 异常处理 什么是异常 异常的种类 异常处理 try ...

  9. LUOGU P1438 无聊的数列 (差分+线段树)

    传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相 ...

  10. 箭头函数报错:Add @babel/plugin-proposal-class-properties (https://git.io/vb4SL) to the 'plugins' section of your Babel config to enable transformation.

    解决:根目录新建babel.config.js加入如下内容 module.exports = { presets: [ "@babel/preset-env", "@ba ...