【Redis高手修炼之路】Redis的持久化——ROB和AOF持久化机制

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Redis高手修炼之路】Redis的持久化——ROB和AOF持久化机制

1.Redis的持久化


问:把客户端和服务端都关闭了,再重新开启服务器和客户端,数据会不会丢失?


答:数据会部分或全部丢失


1.1Redis持久化概述


什么是Redis的持久化:


因为Redis中的数据都是写在内存中的,如果将内存中的数据写到硬盘的文件上,称为持久化。


Redis持久化的两种方式:


RDB格式:Redis DataBase,每过一段时间将内存中的数据写到硬盘上


AOF格式:Append Only File,以日志的方式记录服务器上的每个操作,当服务器重启的时候,将


日志中操作还原到内存中。


2.RDB持久化机制


2.1RDB持久化机制优点


1.方便备份与恢复


整个Redis数据库将只包含一个文件,默认是dump.rdb,这对于文件备份和恢复而言是非常完美


的。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。一旦系统出现灾


难性故障,我们可以非常容易的进行恢复。


2.性能最大化


对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是分叉出子进程,由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。


3.启动效率更高


相比于AOF机制,如果数据集很大,RDB的启动效率会更高


2.2RDB持久化机制缺点


1.不能完全避免数据丢失


因为RDB是每隔一段时间写入数据,所以系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。


2.会导致服务器暂停的现象


由于RDB是通过子进程来协助完成数据持久化工作的,因此当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。一般在夜深人静的时候持久化会比较好。


2.3RDB持计划机制的配置


在redis.windows.conf配置文件中的SNAPSHOTTING快照中有如下说明:

image.png

如下面配置的是RDB方式数据持久化时机,必须两个条件都要满足

image.png

2.4演示:RDB持久化


操作步骤


修改redis.windows.conf 文件的101行


添加1行:save 20 3 (表示20秒内修改3个键,则写入到dump.rdb文件中)


使用指定的配置文件启动服务器:redis-server redis.windows.conf


向数据库中添加2个键,直接关闭服务器窗口。再开启服务器,查看所有的keys,刚才添加的数据


丢失。

微信图片_20220531131206.png

在客户端添加3个键,发现服务器端有如下输出信息,表示写入到数据库dump.rdb文件中

微信图片_20220531131255.png

直接关闭服务器窗口,再开启服务器,查看所有的keys,数据没有丢失。

微信图片_20220531131335.png

3.AOF持久化机制


3.1AOF持久化机制优点


AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。也可以通过该文件完成数据image.png

3.2AOF持久化机制缺点


文件比RDB更大:对于相同数量的数据集而言,AOF文件通常要大于RDB文件。

运行效率比RDB更慢:根据同步策略的不同,AOF在运行效率上往往会慢于RDB。


3.3AOF持久化机制配置


开启AOF持久化


AOF默认是关闭的,首先需要开启AOF模式。

image.png

AOF持久化时机image.png3.4演示:AOF的持久化


操作步骤:


打开AOF的配置,找到APPEND ONLY MODE配置块,392行。设置appendonly yes


通过redis-server redis.windows.conf 启动服务器,在服务器目录下出现appendonly.aof文件。大小是0个字节。


添加3个键和值

微信图片_20220531131750.png

打开appendonly.aof文件,查看文件的变化。会发现文件记录了所有操作的过程。


4.AOF重写机制介绍


4.1为什么需要AOF重写


AOF 持久化是通过保存被执行的写命令来记录数据库状态的,所以AOF文件的大小随着时间的流


逝一定会越来越大;对于Redis服务器,计算机的存储压力;AOF还原出数据库状态的时间都会增


加;


为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器可以创建一个新的


AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文


件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。


4.2AOF文件重写的实现原理


AOF重写并不需要对原有AOF文件进行任何的读取,写入,分析等操作,这个功能是通过读取服务


器当前的数据库状态来实现的。

# 假设服务器对键list执行了以下命令
127.0.0.1:6379> RPUSH list "A" "B"
(integer) 2
127.0.0.1:6379> RPUSH list "C"
(integer) 3
127.0.0.1:6379> RPUSH list "D" "E"
(integer) 5
127.0.0.1:6379> LPOP list
"A"
127.0.0.1:6379> LPOP list
"B"
127.0.0.1:6379> RPUSH list "F" "G"
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "C"
2) "D"
3) "E"
4) "F"
5) "G"
127.0.0.1:6379> 

当前列表键list在数据库中的值就为["C", "D", "E", "F", "G"]。要使用尽量少的命令来记录list键的状


态,最简单的方式不是去读取和分析现有AOF文件的内容,,而是直接读取list键在数据库中的当


前值,然后用一条RPUSH list "C" "D" "E" "F" "G"代替前面的6条命令。


原理:从数据库中读取键现在的值,然后用一条命令去记录键值对,代替之前记录该键值对的多个命令。


4.3AOF重写触发的方式


4.3.1AOF重写概述


aof_rewrite函数可以创建新的AOF文件,但是这个函数会进行大量的写入操作,所以调用这个函数


的线程将被长时间的阻塞,所以Redis将AOF重写程序放到子进程(后台)里执行的。


4.3.2AOF触发方式


手动触发:用户通过调用bgrewriteaof手动触发


自动触发:每次当服务器周期性操作函数执行时,它会检查以下条件是否满足,如果全部满足的话,就触发自动的AOF重写操作:


没有RDB持久化/AOF持久化在执行,没有bgrewriteaof在进行;


当前AOF文件大小要大于redis.conf配置的auto-aof-rewrite-min-size大小;


当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比(在配置文件设置了auto-aof-rewrite-percentage参数,不设置默认为100%)


auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb


4.4演示:AOF手动重写

关闭服务器,删除生成的aof和rdb文件


执行以下命令

微信图片_20220531132338.png

微信图片_20220531132303.png

微信图片_20220531132303.png

输入命令:bgrewriteaof,则aof被重写

微信图片_20220531132441.png

生成旧的文件微信图片_20220531132448.png

服务器上出现提示微信图片_20220531132453.png

4.5演示:AOF后台自动重写


关闭服务器,删除生成的aof和rdb文件

修改配置文件如下:

# 大于原来的50%就自动重写
auto-aof-rewrite-percentage 50
# 自动重写的最小尺寸
auto-aof-rewrite-min-size 100b

带配置文件启动服务器

进行如下操作

微信图片_20220531132655.png

生成的重写文件微信图片_20220531132736.png

服务器端的输出微信图片_20220531132741.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
15天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
1月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
1月前
|
存储 NoSQL Redis
Redis 文件总大小问题之计算待加载AOF文件总大小如何解决
Redis 文件总大小问题之计算待加载AOF文件总大小如何解决
|
1月前
|
NoSQL Redis
Redis AOF重写问题之减少CPU和fork开销如何解决
Redis AOF重写问题之减少CPU和fork开销如何解决
|
1月前
|
NoSQL Redis
Redis 临时manifest修改问题之确保被持久化到磁盘如何解决
Redis 临时manifest修改问题之确保被持久化到磁盘如何解决
|
1月前
|
监控 NoSQL Redis
Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
|
1月前
|
NoSQL Redis
Redis AOF重写问题之产生过多INCR AOF文件如何解决
Redis AOF重写问题之产生过多INCR AOF文件如何解决
|
4月前
|
NoSQL 关系型数据库 MySQL
Redis持久化机制 RDB 和 AOF 的选择
Redis持久化机制 RDB 和 AOF 的选择
83 0
|
4月前
|
存储 缓存 NoSQL
Redis之持久化(RDB和AOF)
Redis之持久化(RDB和AOF)
120 0
|
1月前
|
缓存 NoSQL Redis
redis数据持久化之RDB和AOF
redis数据持久化之RDB和AOF