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程序的基本语法 JS是区分大小写的.如:Name和name是两个变量 JS中每一条语句,一般以英文下的分号(;)结束.这个分号不是必须的.为了向PHP兼容,最好加上分号. 运算符和变量,以及操作之 ...

  2. transient在java中的作用

    java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. trans ...

  3. PAT甲级——A1120 Friend Numbers【20】

    Two integers are called "friend numbers" if they share the same sum of their digits, and t ...

  4. 1.1_springboot2.x与缓存原理介绍&使用缓存

    一.springboot与缓存介绍&使用缓存 1.JSR107 JAVA Cahing定义了5个核心接口,分别是CachingProvider.CacheManager.Cache.Entry ...

  5. 4_1.springboot2.xWeb开发使用thymeleaf

    1.简介 如果使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来: ...

  6. JavaScript特效源码(1、文字特效)

    注:本文以及以下关于Javascript特效源码都是分享自JavaScript源码大全. 1.逐隐逐现的的特效 逐隐逐现的文字特效[推荐使用][适用于IE4++] (修改显示的文字后根据说明进行共2步 ...

  7. Qt下QMainWindow内部QTableView不能自适应大小

    中央窗体设置的是一个QWidget 一直排查不到原因 最后发现为 因为布局中为QTableView设置了对齐方式 取消即可!

  8. Android开发 从代码里设置Drawable图片不显示的问题

    问题描述 我们从代码里获得Drawable在设置给View时会发现,图片不显示的问题.比如如下代码: Drawable drawable = getResources().getDrawable(R. ...

  9. 修改Apache的默认站点目录的方法,需要的朋友可以参考下

    由于博客系统崩了,所以要考虑重新建立博客系统,首先遇到的一个问题就是原来的博客系统是安装一个独立的磁盘上面的(http://m.0834jl.com)不是安装在系统盘上面的,然而一般在linux下面安 ...

  10. threading.local在flask中的用法

    一.介绍 threading.local的作用: 多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据的存储,而每块空间内的数据也不会错乱. 二.不使用threading. ...