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. 响应式编程(Reactive Programming)(Rx)介绍

    很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它 ...

  2. 面试系列12 redis和memcached有什么区别

    (1)redis和memcached有啥区别 这个事儿吧,你可以比较出N多个区别来,但是我还是采取redis作者给出的几个比较吧 1)Redis支持服务器端的数据操作:Redis相比Memcached ...

  3. iOS逆向系列-逆向APP思路

    界面分析 通过Cycript.Reveal. 对于Reveal安装配置可参考配置iOS逆向系列-Reveal 通过Reveal找到内存中的UI对象 静态分析 开发者编写的所有代码最终编译链接到Mach ...

  4. java命令行编译执行

  5. 防范永恒之蓝勒索病毒-XP、Win10文件共享怎样设置

    企业内部员工之间的文件共享,是企业内部文件交换的重要手段.传统的文件共享是通过Windows的目录共享来实现的,而目录共享功能因其可能存在安全隐患使得很多企业分发放弃了这个文件共享模式. 如去年勒索病 ...

  6. js闭包与java内部类

    在js中闭包用的比较广泛,主要解决变量作用域导致的问题.

  7. C++ AOP手法

    1.代理模式 2.模版 3.NVI(non-virtual interface) 参考:https://www.cnblogs.com/qicosmos/p/4772389.html <effe ...

  8. python requests 高级用法 -- 包括SSL 证书错误的解决方案

    Session Objects会话对象 Session对象在请求时允许你坚持一定的参数.此外,还坚持由Session实例的所有请求的cookie. 让我们坚持在请求时使用 s = requests.S ...

  9. strict

    strict为3.2.3新增连贯操作,用于设置数据写入和查询是否严格检查是否存在字段.默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常. 例如: $model->strict(t ...

  10. Django缓存机制以及使用redis缓存数据库

    目录 Django 配置缓存机制 缓存系统工作原理 Django settings 中 默认cache 缓存配置 利用文件系统来缓存 使用Memcache来缓存: 使用Local-memory来缓存: ...