首页 > 数据库 >10_redis持久化

10_redis持久化

时间:2024-03-10 22:34:15浏览次数:20  
标签:10 持久 文件 redis AOF RDB 快照 重写

redis持久化:如何把内存数据写回磁盘

redis持久化有两种方式:RDB(Redis DataBase)和AOF(Append Only File)

RDB

RDB持久性是以指定的时间间隔执行数据集的时间点快照。类似于照片记录方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这个快照文件称之为RDB文件(dump.rdb),其中RDB就是Redis DataBase缩写。

Redis的数据都在内存中,保存备份时它执行的是全量快照,也就是说,把内存中的所有数据都记录到内存上。RDB保存的文件叫做dump.rdb

RDB配置说明

  • 自动触发:
  1. 首先配置redis7.conf配置文件:
#	1h内有1次修改
#   * After 3600 seconds (an hour) if at least 1 change was performed
#	5min内有100次修改
#   * After 300 seconds (5 minutes) if at least 100 changes were performed
#	1s内有10000次修改
#   * After 60 seconds if at least 10000 changes were performed
#
# You can set these explicitly by uncommenting the following line.
#
# save 3600 1 300 100 60 10000

# 5s内有两次修改即可写回磁盘
save 5 2
# 修改dump.rdb存储路径(文件夹需要提前建立好)
dir /myredis/dumpfiles
# 修改备份文件名称
dbfilename dump6379.rdb
  1. 关于备份文件如何恢复问题:将备份文件(dump.rdb)移动到redis安装目录并启动服务即可。
  • 手动触发
  1. save: 在主程序执行会阻塞当前redis服务器,直到持久化工作完成。执行save命令期间,redis不能处理其它命令,线上禁止使用。
  2. bgsave(默认): redis会使用bgsave对当前的内存中的额所有数据做快照,这个操作是子进程在后台完成的,这就允许主进程同时可以修改数据。使用lastsave命令获取最后一次成功执行快照的时间。

RDB优缺点

  1. 优点:
    1. RDB非常适合灾难恢复,它是可以远程传输到数据中心的压缩文件。
    2. DB最大限度的提高了redis的性能,子进程只需要完成IO持久化操作,而父进程永远不会执行IO操作。
    3. 与AOF相比,RDB允许大数据集更快的重启(RDB文件在内存中的加载速度要比AOF快得多)。
    4. 在副本上,RDB支持重启和故障转移后的部分重新同步。
  2. 缺点:
    1. RDB如果由于任何原因没有正确关闭的情况下停止工作,您应该做好丢失最新部分的数据准备。
    2. RDB需要经常fork()以使用子进程在磁盘上持久化,如果数据集很大,fork()可能会消耗很多系统资源,此外,在fork()的时候,内存中的数据被克隆了一份,大致2倍的膨胀性,这里需要考虑。

检查和修复RDB文件

如果RDB文件出现破损时,可以使用如下命令进行检查修复:

redis-check rdb /myredis/dumpfiles/dump6379.rdb

哪些情况会触发RDB操作

  1. 配置文件中默认的快照配置
  2. 手动触发save/bgsave命令。
  3. 执行flushall/flushdb命令,但dump.rdb里面是空的。
  4. 执行shutdown且没有设置开启AOF持久化。
  5. 主从复制时,主节点自动触发。

如何禁用快照(不想用redis持久化)

  1. 动态所有停止RDB保存规则的方法(本次生效):redis-cli config set save ""
  2. 快照禁用:在配置文件redis7.conf中修改(永久):save ""

RDB优化配置项

在redis7.conf配置文件中:

# YES:如果bgsave出现快照写入失败的时候立马停止写入;NO:如果快照写入失败,也能确保redis继续接受新的写请求。
stop-writes-on-basave-error yes(no)

# 对于存储到磁盘的快照,可以设置是否进行压缩存储,如果是的话,redis会采用LZF算法,如果你不想小号CPU来进行压缩的话,可以设置关闭此功能。
rdbcompression yes(no)

# 在存储快照后,可以让redis使用CRC64算法进行数据校验,但是会增加性能消耗。
rdbchecksum yes(no)

# 在没有持久性的情况下删除复制中使用的RDB文件启用。默认情况下是no,此选项是禁用的
rdb-del-sync-files no

AOF

以日志的形式记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不用记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据。换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次完成数据的额恢复操作。

默认情况下,redis是没有开启AOF(Append only File)的。开启AOF功能需要在redis.conf配置文件中进行配置:appendonly yes,AOF保存的文件是appendonly.aof文件。

AOF持久化工作流程

  1. Client客户端作为命令的来源,会有多个源头以及源源不断的请求命令。
  2. 在这些命令到达redis server以后并不是立刻写入AOF文件中,而是将这些命令先缓存到AOF缓冲区中,当存在的命令数量到达一定量后再统一写回磁盘,避免频繁的IO操作。
  3. AOF缓冲区会根据AOF缓冲区同步文件的三种写回策略将命令写会磁盘的AOF文件中。
  4. 随着写入AOF内容的增加为避免文件膨胀,会根据规则进行命令的合并(又称AOF重写),从而起到AOF文件压缩的目的。
  5. 当redis server重启以后会从AOF文件载入数据。

AOF缓冲区三种写回策略

在redis.conf配置文件中配置写回策略:appendfsync everysec(默认)

  • Always: 同步写回,每个写命令执行完立即同步地将日志写回磁盘(命令永不丢失但是IO开销较大)。
  • Everysec: 每秒写回,每个写命令执行完,只是先把日志写到AOF缓冲区中,每隔1s把缓冲区的数据写回磁盘(兼顾两种的优点)。
  • no: 操作系统控制的写回,每个命令执行完后,只是先把日志写到AOF内存缓冲区中,由操作系统决定何时将缓冲区的数据写回磁盘(IO开销最小,丢失数据可能性很大)。

AOF配置/启动/修复/恢复

AOF文件配置:

  1. 开启AOF:在redis.conf配置文件中打开:appendonly yes
  2. 使用默认的写回策略(每秒钟):在redis.conf配置文件中打开:appendfsync everysec
  3. aof文件保存路径:在redis.conf配置文件中打开:dir /myredis(自定义)
  4. aof文件名修改:在redis.conf配置文件中打开:appenddirname "myredis/appendonlydir/xxx.aof"

AOF正常恢复:

  1. 重启redis然后重加载,结果OK。

AOF异常恢复:

  1. 故意乱写正常的AOF文件,模拟网络闪断文件写error
  2. 重启redis之后就会进行AOF文件的载入,发现启动都不行。
  3. 异常修复命令:redis-check-aof --fix进行修复
  4. 重启OK

AOF优势和劣势

优点:

  1. 更好的持久,写入性能很好,因为写回策略是后台线程执行的。
  2. AOF日志不会出现寻道问题,也不会在断电时出现损坏,出于某种原因导致写回出错,可以使用redis-check-aof工具进行修复。
  3. 当AOF太大时,redis可以在后台自动重写AOF,重写是完全安全的。

缺点

  1. AOF文件相比于RDB文件更大,且恢复速度要慢于RDB。
  2. AOF运行效率慢于RDB。

AOF重写机制

AOF随着写入越来越大,当AOF文件的大小超过所设定的峰值时,Redis就会自动启用AOF文件内容压缩。只保留可以恢复数据的最小指令集或者可以手动使用命令bgrewriteaof来重新更新。

触发机制:

  1. 自动触发:在配置文件redis.conf中进行如下配置:

    # 根据上次重写后的AOF大小,判断当前AOF文件大小是不是增长了1倍,就启动重写机制
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
  2. 手动触发:客户端手动想服务器发送bgrewriteaof命令。

AOF重写不仅降低了文件的占用空间,同时更小的AOF文件也可以更快的额被redis加载。

重写原理:

  1. 再重写开始前,redis会创建一个重写子进程,这个子进程会读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。
  2. 与此同时,主进程会将接收到新的写指令一边积累到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免再重写过程中出现意外。
  3. 当重写子进程完成重写工作后,它会给父进程发送一个信号,父进程收到信号后会将内存中缓存的写指令追加到新的AOF文件中。
  4. 当追加结束后,redis就会使用新的AOF文件来代替旧的AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中。
  5. 重写AOF文件的操作,并没有读取旧的AOF文件,而是将整个内存的数据库内容用命令的方式重写了一个AOF文件,这个和快照有点类似。

AOF优化配置

配置文件APPEND ONLY MODE模块

  1. appendonly:是否开启aof
  2. appendfilename:文件名称
  3. appendfsync:同步方式
  4. no-appendfsync-no-rewrite:aof重写期间是否同步
  5. auto-aof-rewrite-percentage auto-aof-rewrite-min-size:重写触发配置,文件重写策略。

RDB-AOF混合持久化

RDB与AOF可以同时开启,但AOF优先于RDB。因此在redis重启时只会加载AOF文件,不会加载RDB文件,因为通常情况下AOF文件保存的数据集比RDB更完整

纯缓存模式

同时关闭RDB和AOF,只是单纯的做缓存用,不用持久化。

如何开启纯缓存模式

  1. 禁用RDB:save ""
  2. 禁用AOF:appendonly no

标签:10,持久,文件,redis,AOF,RDB,快照,重写
From: https://www.cnblogs.com/lilyflower/p/18065020

相关文章

  • 03/10/2024 上课笔记 & 解题报告
    双向链表前言第一次接触这玩意儿,所以记录一下。题目[国家集训队]种树题目描述A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。园林部门得到指令后,初步规划出\(n\)个种树的位置,顺时针编号\(1\)到\(n\)。并且每个位置都有一个美观......
  • 我的高考不到100天
    我的高考不到100天DAY-89修改了周末的测试,简记了解到的之前不懂的东西化学:溴水(包括溴的CCI4溶液)和液溴的区别是液溴的溴含量大于前者加成反应时大多是溴水,取代反应则是液溴(反应从易到难,溴含量随之增大)物理:对\(R=pl/s\)多了一些了解,其中的\(l\)是指电流流过的长度,\(s\)是......
  • 1005. K 次取反后最大化的数组和c
    intlargestSumAfterKNegations(int*nums,intnumsSize,intk){intt[201]={0};intsum=0;for(inti=0;i<numsSize;i++){t[100+nums[i]]++;sum+=nums[i];}while(k>0){for(inti=0;i<201;i++){......
  • 2024.3.04~2024.3.10 by manjuan
    给你一个数组a1,a2…an。请计算有多少个图元(i,j,k,l)符合以下条件:·\(1\)\(\le\)\(i\)<\(j\)<\(k\)\(<\)\(l\)\(\le\)n·a\(i\)\(=\)a\(k\)和a\(j\)\(=\)a\(l\)\(Input\)Thefirstlinecontainsasingleinteger\(t\)(\(1\)≤\(t\)......
  • vs2019单独重新安装python37_64失败解决办法(bilibili上我最早写的是https://www.bilib
    上个周末的时候,我发现用vs2019编写python的时候。代码高亮出现了奇怪的问题,进入解决方案的时候,print还是蓝色的,但是过了几秒钟后就变为黑色了,因此在最开始的时候我试图通过换一个皮肤和在管理扩展里面找扩展来解决,但是还是有相关问题。于是到vs2019对应的python文件夹找问题,目录是......
  • 3.10
    昨天放假回去得知我对象给我买了一个重云的吧唧,真的好可爱啊......
  • Redis数据类型及其常用命令
    一、Redis字符串(String)String是Redis最基本的类型,一个key对应一个value,它是二进制安全的(String可以包含任何数据,如jpg图片或者序列化的对象),一个字符串value最多可以是512MBSETkeyvalue[NX|XX][GET][EXseconds|PXmilliseconds|EXATunix-time-seconds|PXATunix-......
  • 分布式锁实现——Redis
    分布式锁分布式锁的视线方式Redis实现分布式锁Zookeeper实现分布式锁MySQL实现分布式锁Etcd实现分布式锁实现分布式锁注意的点互斥性可重入性锁超时,防死锁锁释放正确,防误删阻塞和非阻塞公平和非公平Redis实现分布式锁的特点Redis是高性能的内存数据库,满足高......
  • 3101: *【莫比乌斯反演:练习】gcd(i,j)=k的对数[POI2007]ZAP-Queries
    问题给出\(n,m,k\)(\(1\leqn,m,k\leq10^5\)),求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^m\lbrack\gcd(i,j)=k\rbrack\),即:满足\(1\leqi\leqn\),\(1\leqj\leqm\),且\(\gcd(i,j)=k\)的二元组\((i,j)\)的数量。题解\(\sum\limits_{i=1}......
  • 2024年3月10号题解
    299.猜数游戏解题思路对出现的数字在两个数组中进行统计先计算公牛的个数,如果有那么统计的数字的数量对应减一,因为统计是用来算奶牛的数量的遍历统计数组,奶牛的数量加上两个数组中最小的值,因为是匹配,所以不可能多出来的也可以匹配,所以是加上其中的最小值代码实现intmin(i......