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. URL类发送请求

    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...

  2. map 与 lambda 的用法

    # 列表中的每个元素进行*2lis = [10, 30, 70]f = map(lambda li: li*2, lis) # 操作lis中的每个元素.print(list(f)) # 返回来一个新的 ...

  3. css中字体属性的简写

  4. CAS机制详解

    目录 1. 定义 2. 实现原理 3. 无版本号CAS实战说明 4. CAS机制在Java中的应用 5. CAS的缺点 1. CPU开销过大 2. 不能保证代码块的原子性 3. ABA问题 6. JA ...

  5. Matlab AlexNet 识别花

    1. 首先,你要又并行计算的工具箱,在插件选项里面找到,安装即可 2. 下载训练的数据集,采用matlab演示的材料即可 https://matlabacademy-content.mathworks ...

  6. angular管道操作符的使用

    一.Angular的常用内置管道函数 比如说很多时候我们需要把数字显示成金额.大小写转换.日期小数转换等等. Angular管道对于象这样小型的转换来说是个很方便的选择. 管道是一个简单的函数,它接受 ...

  7. 2006-2007 ACM-ICPC | POJ3380 POJ3384 POJ3385 水题题解

    // CF比赛链接:http://codeforces.com/gym/101650 // POJ链接:http://poj.org/searchproblem?field=source&ke ...

  8. Hie with the Pie (POJ 3311) 旅行商问题

    昨天想练习一下状态压缩,百度搜索看到有博客讨论POJ 3311,一看就是简单的旅行商问题,于是快速上手写了状态压缩,死活样例都没过... 画图模拟一遍原来多个城市可以重复走,然后就放弃思考了... 刚 ...

  9. hibernate离线条件查询设置or关系

    detachedCriteria.add(Restrictions.or(Restrictions.isNull(""), Restrictions.isNull("&q ...

  10. Python学习day26-面向对象之小结

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...