Redis学习笔记03-持久化
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-持久化的更多相关文章
- Redis学习笔记9--Redis持久化
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式:二是Appen ...
- Redis学习笔记(一)-持久化
一.RDB持久方式 RDB持久化是把当前进程的数据已快照的形式保存到硬盘的过程. 触发方式: 1.手动触发命令:save和bgsave save:阻塞式,内存较大的实例在执行过程中会造成长时间的阻塞, ...
- redis学习笔记-03:redis安装
一.redis的安装和配置 1.下载redis-5.0.4.tar.gz到/opt目录下,解压命令 :tar -zxvf redis-5.0.4.tar.gz,解压后出现redis-5.0.4的文件夹 ...
- Redis:学习笔记-03
Redis:学习笔记-03 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 7. Redis配置文件 启动 ...
- Redis学习笔记六:持久化实验(AOF,RDB)
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- Redis学习笔记(1)——Redis简介
一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- redis学习笔记(3)
redis学习笔记第三部分 --redis持久化介绍,事务,主从复制 三,redis的持久化 RDB(Redis DataBase)AOF(Append Only File) RDB:在指定的时间间隔 ...
- Redis学习笔记(二) Redis 数据类型
Redis 支持五种数据类型:string(字符串).list(列表).hash(哈希).set(集合)和 zset(有序集合),接下来我们讲解分别讲解一下这五种类型的的使用. String(字符串) ...
随机推荐
- 海量数据解决思路之Hash算法
海量数据解决思路之Hash算法 一.概述 本文将粗略讲述一下Hash算法的概念特性,里边会结合 分布式系统负载均衡 实例对Hash的一致性做深入探讨.另外,探讨一下Hash算法在海量数据处理方案中 ...
- 51nod-1130-N的阶乘的长度V2(斯特林近似)-套斯特林公式
输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. 输入 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000) 第2 - T + 1行:每 ...
- JavaScript基础的一些小总结
一.js变量 1.变量声明: var 关键字来进行变量声明 变量是弱类型 1.数字 2.小数 3.boolean 4.字符串 4.字符 验证数据类型:1.整数,小数是numbe ...
- Git上传文件指北
PS:之前设置SSH密钥之类的步骤假设都已经完成,只需日常上传文件 1.仓库初始化 假设你已经新建好了一个仓库(New Repository),名为:RepoName 选择你代码所在的本地文件夹,鼠标 ...
- 2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法
title author date CreateTime categories Roslyn 让 VisualStudio 急速调试底层库方法 lindexi 2019-5-29 20:2:9 +08 ...
- Leetcode92. Reverse Linked List II反转链表
反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m = 2 ...
- Python全栈开发:web框架之tornado
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- 使用log4j实现日志API
添加SLF4J依赖,用于提供日志API, 使用log4j作为实现 1.pom.xml添加SLF4J依赖 <!-- SLF4J --> <dependency> <grou ...
- 阿里重磅开源首款自研科学计算引擎Mars,揭秘超大规模科学计算
日前,阿里巴巴正式对外发布了分布式科学计算引擎 Mars 的开源代码地址,开发者们可以在pypi上自主下载安装,或在Github上获取源代码并参与开发. 此前,早在2018年9月的杭州云栖大会上,阿里 ...
- 数组(Array)与 字符串(String)公用的属性与方法
数组与字符串都有很多方法,有一些方法是公用的,在这里就将数组与字符串公用的方法提取出来,方便大家的记忆 1. length 可通过str.length与arr.length分别取到字符串与数组的长度: ...