Redis持久化配置与操作
持久化
写在前面
在
linux
系统中:
- 父子进程数据是隔离的
- 父进程可以让子进程看到父进程的数据,采用
export
修饰export
的环境变量,父子进程的修改互补影响,影响范围仅为自身进程
redis如何在非阻塞的情况下对某一时刻数据进行持久化
- redis父进程使用
fork()
系统调用,创建一个子进程,其为redis中创建那一刻中虚拟地址的拷贝,其虚拟地址同样指向相同的内存地址,则有两个虚拟地址引用了该物理地址fork()
实现了copy on write
内存机制,在父进程修改数据时,首先会在内存中写入修改的值,并将指针从原来的地址指向新的地址,所以子进程的数据不会改变,还是那一刻的数据,从而达到非阻塞保存时点快照
fork()特点:速度快,占用空间小
RDB
主动(同步阻塞):比如关机维护时使用
被动(异步非阻塞):
fork()
系统调用,可在配置文件中配置触发规则#在多少秒后至少有多少个key发生变化触发写入磁盘操作(可配置多条) save <seconds> <changes> #默认开启,可增加 save "" 表示禁用
- 如果想要修改写入磁盘文件名称,找到
dbfilename dump.rdb
对dump.rdb
改为需要的文件名 - 如果想要修改写入磁盘文件位置,找到
The working directory
注释,重写其dir
路径即可
只要触发了RDB操作,等待该操作完成后,下一次的RDB触发才可执行
- 如果想要修改写入磁盘文件名称,找到
弊端:
- 不支持拉链,永远只有一个
dump.rdb
文件,需要人为干预进行备份 - 时点与时点之间窗口数据容易丢失,如:8点得到一个RDB数据文件,9点刚要触发RDB,宕机了,那么8点到9点的数据就丢失了
优点:类似java
中的序列化,恢复的速度相对较快(rdb
文件为二进制文件,可以对数据进行快速恢复)
适当的配置redis最大存储空间maxmemory可以提升RDB的效率,最大空间过大会导致RBD时间过长
AOF
RDB与AOF可以同时开启,如果开启了AOF只会使用AOF进行数据恢复
优点:数据丢失少
弊端:操作日志文件的体量会越来越大,从而导致恢复慢
针对弊端redis根据让日志只记录增量且合并重复命令的原理对AOF进行了优化:
4.0前:重写日志文件,删除抵消的命令合并重复的命令,得到一个缩小版的纯指令的日志文件
4.0后:重写日志文件,将某一刻老的数据RDB到AOF文件中,将增量的指令以追加的方式追加到AOF文件中
AOF是一个混合体,既利用了RDB的快速恢复也利用了日志的全量特点
相关配置
- AOF默认关闭:
appendonly no -> yes
开启AOF - 默认AOF文件名:
appendfilename "appendonly.aof"
可自定义 - redis往
aof
文件中刷写的策略appendfsync always
:每来一条指令调用一次内核将数据直接刷写到磁盘,最多丢失一条数据(一条指令正在写宕机了);数据最可靠appendfsync everysec
:每秒触发一次I/O对buffer
进行flush
到aof
文件中,可能会导致接近一个buffer
缓存内容的丢失;数据较为可靠appendfsync no
:每当内核buffer
缓冲区内容填满时触发一次I/O,对缓冲区的数据flush
写入磁盘aof
文件;最多丢失一块buffer
缓冲区内容数据,换来I/O成本最少
no-appendfsync-on-rewrite
:yes/no(默认)
当redis抛出一个子进程进行AOF重写或者RDB重写,允不允许序号3的策略进行aof
文件的写入,yes可能会导致一部分性能阻塞,no可能导致一些数据的丢失aof-use-rdb-preamble yes
:开启重写日志文件,见上4.0后;如果aof
文件以REDIS
开头的则是重写过的混合体文件(默认开启)- 自动触发
BGREWRITEAOF
(重写)规则auto-aof-rewrite-percentage [百分比(省略%)]
:记录6.2.
命令达到的百分比触发重写auto-aof-rewrite-min-size [文件大小(mb)]
:首次aof
文件达到该大小且满足6.1.
自动触发重写,并且redis会记录重写后此时文件大小lastSize
,当文件超过lastSize
的设置百分比6.1.
时再次出发重写,依次类推自动重写操作(此变量仅初始化启动redis有效,如果是redis恢复时,则lastSize
等于初始aof
文件大小)
实操
关闭混合模式
vi /etc/redis/6379.conf
#关闭redis后台运行 daemonize no #logfile "" 默认控制台打印,并无日志输出,需要日志输出指定输出路径即可(注释也是前台控制台打印) #配置RDB save策略 save 3600 1 save 300 100 save 60 10000 #开启AOF appendonly yes #关闭混合模式 aof-use-rdb-preamble no
异常备注
#在redis进程kill又自动启动的情况下,关闭进程,无密码省略 -a [password] redis-cli -a [password] shutdow
redis-server /etc/redis/6379.conf
使用指定的配置文件启动redis,会在配置的文件目录下生成持久化的文件
set k1 hello
在aof
文件中生成如下内容:#根据该文件,可对命令进行解析执行 *2 #*代表下面指令由几个元素组成 $6 #描述下一行元素由几个字节组成 SELECT #元素1 $1 0 #元素2 *3 $3 set $2 k1 $5 hello
bgsave
:触发fork()
,在持久化目录中会将当前数据序序列化到磁盘rdb
文件,其文本开头位REDIS
REDIS0009ú redis-ver^E6.2.1ú redis-bitsÀ@ú^EctimeÂ<91>Ü/cú^Hused-mem -^Q^@ú^Laof-preambleÀ^@þ^@û^B^@^@^Bk1^Ehello^@^Bk2^Dooxxÿ8^[<97>XË^H@O
redis-check-rdb dump.rdb
:检查rdb
文件是否正常armin@xiaobawangxuexiji-2 db % redis-check-rdb dump.rdb [offset 0] Checking RDB file dump.rdb [offset 26] AUX FIELD redis-ver = '6.2.1' [offset 40] AUX FIELD redis-bits = '64' [offset 52] AUX FIELD ctime = '1664081041' [offset 67] AUX FIELD used-mem = '1125792' [offset 83] AUX FIELD aof-preamble = '0' [offset 85] Selecting DB ID 0 [offset 116] Checksum OK [offset 116] \o/ RDB looks OK! \o/ [info] 2 keys read [info] 0 expires [info] 0 already expired
BGREWRITEAOF
:后台重写aof
文件,去除无效重复指令*(如果在一个key值中多次重写key值,aof
文件中仅会存储最后一条指令)*
开启混合模式
vi /etc/redis/6379.conf
aof-use-rdb-preamble yes
redis-server /etc/redis/6379.conf
:持久化目录下出现一个空的aof
文件set k1 a; set k1 b; set k1 c; set k1 d
:目前aof
文件内容:*2 $6 SELECT $1 0 *3 $3 set $2 k1 $1 a *3 $3 set $2 k1 $1 b
BGREWRITEAOF
:手动执行重写后,打开aof
文件*(变为序列化内容)*REDIS0009ú redis-ver^E6.2.1ú redis-bitsÀ@ú^EctimeÂXæ/cú^Hused-memÂP-^Q^@ú^Laof-preambleÀ^Aþ^@û^A^@^@^Bk1^Adÿ^Yuâ¶<86>ç«>
set k1 e; set k1 f
:继续对key重新赋值,再查看aof
文件*(后面的内容以追加指令的形式追加到aof文件中,此时的文件为混合文件)*REDIS0009ú redis-ver^E6.2.1ú redis-bitsÀ@ú^EctimeÂXæ/cú^Hused-memÂP-^Q^@ú^Laof-preambleÀ^Aþ^@û^A^@^@^Bk1^Adÿ^Yuâ¶<86>ç«>*2^M $6^M SELECT^M $1^M 0^M *3^M $3^M set^M $2^M k1^M $1^M e^M *3^M $3^M set^M $2^M k1^M $1^M f^M
bgsave
:将以上时点数据持久化到rdb
文件BGREWRITEAOF
:重写aof
文件,目前内容与bgsave
得到的rdb
文件解析内容一致,均为以上时点序列化的数据
注意:无论在是否混合模式下的aof
持久化,在最后有执行flushall
或相关清库指令,如果想要恢复清库前的数据,不可执行BGREWRITEAOF
重写操作,否则数据无法找回*(重写后的aof
文件仅有清库指令)*;此种情况恢复数据需要将aof
文件中最后一条清库指令移除再进行数据导入
Redis持久化配置与操作相关推荐
- Redis持久化配置
Redis持久化配置持久化: 即把数据存储于断电后不会丢失的设备中,通常是硬盘. 常见的持久化方式:主从:通过从服务器保存和持久化,如mongoDB的replication sets配置. 淘宝是主服 ...
- 运维之道 | Redis 持久化配置
Redis 持久化配置 前言 Redis为持久化提供了两种方式: RDB:在指定的时间间隔能对你的数据进行快照存储. AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的 ...
- docker+redis 持久化配置(AOF)
RDB持久化与AOF持久化简单描述 RDB:RDB使用快照的方式存储数据库中的内容,直接将所有键值对数据全部存入二进制文件.建议使用BGSAVE来进行备份,整个过程会新fork一个子进程来执行,不影响 ...
- redis持久化配置及两种方式
持久化 redis持久化是指在指定的时间间隔内将内存中的数据集快照(snapshotting)写入磁盘,恢复时是将快照文件读入内存 redis提供了两种持久化方式 一:RDB内存快照 1:概念 RDB ...
- Redis[5] key的过期时间删除策略、实现lru算法、持久化配置
文章目录 Redis[5] key的过期时间删除策略.持久化配置 **Redis6的key过期时间删除策略** Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务 ...
- Redis-学习笔记03【Redis持久化】
Java后端 学习路线 笔记汇总表[黑马程序员] Redis-学习笔记01[Redis环境搭建] Redis-学习笔记02[Redis命令操作] Redis-学习笔记03[Redis持久化] Redi ...
- Docker安装Redis以及配置Redis环境
1,下载Redis镜像 首先拉取 Redis 镜像, 这里我选择的是 redis:alpine 轻量级镜像版本 docker pull redis:alpine 下载完成后,通过 docker ima ...
- 跟着狂神学Redis(NoSql+环境配置+五大数据类型+三种特殊类型+Hyperloglog+Bitmap+事务+Jedis+SpringBoot整合+Redis持久化+...)
跟着狂神学Redis 狂神聊Redis 学习方式:不是为了面试和工作学习!仅仅是为了兴趣!兴趣才是最好的老师! 基本的理论先学习,然后将知识融汇贯通! 狂神的Redis课程安排: nosql 讲解 阿 ...
- redis主从配置之持久化配置
环境描述: centos:7.6docker:19.03.1redis:6.0.9 对于centos怎么装docker,docker又怎么装redis镜像等等内容就不做概述了.如果还不会这个,就先去百 ...
最新文章
- PCL :K-d tree 2 结构理解
- WebService调用(基于KSOAP2)
- 控件尺寸规范_微信小程序设计规范你了解多少
- Git 常用命令速查表(图文+表格)【转】
- LeetCode 2208. 将数组和减半的最少操作次数(优先队列)
- logminer java_使用OracleLogminer同步Demo1Demo介绍-博客园.PDF
- java 注释快捷打出时间_Java快捷---自动注释时间作者。。。
- 图像处理保研面试_细思极妙的保研面试经验汇总?这些小技巧太加分了吧
- linux mq脚本,Linux自动化命令工具expect
- 希捷四十载:如何做好一家非常规存储公司?
- Win11如何提高游戏性能?Win11提升游戏性能的方法
- 我的站(艾网---城市生活新门户)重新上线了
- Dart 基础篇-所有知识点架构
- 如何使用计算机改进生产线,计算机系统结构复习资料
- 马蜂窝张矗:绩效考核是为了激发工作潜力,而不是逃避问题
- 《站在两个世界的边缘》 程浩,一个认真生活过的人
- c语言里的除法运算定律,加法乘法运算,乘法需要打括号吗?
- 一文读懂随机森林的解释和实现(附python代码)
- 感谢同事的临别赠言,愿自己一路顺风
- win10关闭自带的杀毒