首页 > 数据库 >Redis持久化(Redis persistence)

Redis持久化(Redis persistence)

时间:2024-04-06 23:36:06浏览次数:27  
标签:文件 持久 AOF Redis 命令 RDB 快照 persistence

Redis持久化:How Redis writes data to disk(怎么把数据从内存中写入硬盘) 

一、RDB(Redis DataBase)

  RDB:以指定的时间间隔执行数据集的时间点快照(snapshot),将数据和状态以文件的形式写入磁盘,快照文件称为RDB文件(dump.rdb),保存备份是它执行的是全量快照(保存内存中的全部数据)。

 

(1)自动触发    案例:5秒中至少有两次修改就进行持久化操作(关闭 Redis 或者使用 flushdb 命令后,不满足前面的条件也会触发RDB)

  

  修改 dump 文件名称

  

  修改 dump 文件保存路径

  

  执行 flushall / flushdb 命令也会产生 dump.rdb 文件,但里面是空的。

  启动 Redis 后读取 /opt/myredis/dumpfiles 路径下的备份文件

  Redis 备份文件和 Redis 不要放在一台主机上

(2)手动触发

  SAVE:执行备份,在主程序中执行会阻塞当前 Redis 服务器,直到持久化工作的完成,执行 SAVE命令期间,Redis 不能处理其他命令

  BGSAVE:执行备份,在后台异步进行快照操作,不阻塞方式,fork一个子进程在后台进行持久化操作,同时主进程可以修改数据

  LASTSAVE:查看最后一次成功执行快照的时间,返回时间戳

  

(3)RDB 文件的修复

   /usr/local/bin路径下执行 redis-check-rdb xxx.rdb

(4)触发 RDB 快照的情况

  • 配置文件中进行了快照配置
  • 手动执行SAVEBGSAVE命令
  • 执行FLUSHDBFLUSHALL命令,产生的 rdb 文件是空的
  • 执行SHUTDOWN命令且没有开启 AOF 持久化
  • 主从复制时,主节点自动触发

(5)禁用 RDB 快照

  • 动态禁止redis-cli config set save ""
  • 永久生效,在配置文件中将原本的save <seconds> <changes> 改为 save ""

(6)RDB 优化参数

  • stop-writes-on-bgsave-error yes在执行BGSAVE是发生错误是否停止写入,默认为 yes
  • rdbcompression yes在保存快照文件时是否进行压缩,Redis 会采用 LZF 算法进行压缩  
  • rdbchecksum yes在保存快照文件时是否进行数据校验(采用 CRC64),但是会增加大约10%的性能消耗
  • rdb-del-sync-files no在没有持久性的情况下删除复制中使用的RDB文件

(7)总结

   优点:适合大规模的数据恢复;定时任务备份;RDB文件加载速度比 AOF 快

   缺点:快照之间的数据可能会丢失;RDB 进行数据的全量快照,在数据量太大的情况下会严重影响服务器性能

  

二、AOF(Append Only File)

  以日志的形式来记录每个操作,只记录写命令,只允许追加文件不能修改文件,Redis 启动后会执行日志文件中的内容,从而完成数据的恢复。

 

(1)开启 AOF

  appendonly yes备份文件为 appendonly.aof

(2)AOF 持久化流程

  Redis Server 接收写命令后不会马上将其写入 AOF 文件,会先在 AOF 缓存中进行保存,AOF 缓冲区会根据同步文件的三种策略将命令写入磁盘。随着 AOF 内容的增加,会根据规则进行命令的合并(AOF 重写),达到压缩 AOF 文件的目的。启动 Redis Server 后会根据 AOF 文件将数据载入到内存中。

(3)同步文件的三种策略

  • Always同步写回,每个写命令执行完后立刻同步地将日志写入磁盘
  • no每个写命令执行完,先把日志写到 AOF 缓冲区中,由操作系统决定何时将缓冲区内容写入磁盘
  • everysec(默认策略)每秒写回,每个写命令执行完,先把日志写到 AOF 缓冲区中,每隔 1 秒再将缓冲区内容写入磁盘

  

(4)AOF 文件的保存路径

  

(5)AOF 文件名称及其组成(Redis 7 之后的 aof 文件有 3 种类型)Multi Part AOF

  

  BASE:基础 AOF ,一般由子进程通过重写产生,该文件最多只有一个

  INCR:增量 AOF,一般会在 AOFRW(重写) 开始后被创建,可以有多个

  HISTORY:历史 AOF,由 BASE 和 INCR AOF 变化而来,本次 AOFRW 之前对应的 BASE 和 INCR 都将变成 HISTORY,该类型的 AOF 文件会被 Redis 自动删除

  上述文件由 manifest(清单) 来进行管理和跟踪,AOF 文件和 manifest 被放入一个单独的目录中,目录名由 appenddirname 配置

  读取到的写指令会被加到 INCR 文件中

 (6)INCR AOF 文件修复命令

  在/usr/local/bin目录下的redis-check-aof命令

  redis-check-aof --fix appendonly.aof.1.incr.aof会删除出错的命令和出错命令之后的所有命令

(7)总结

  优点:更好的保存数据,性能高,数据可以紧急恢复

  缺点:AOF 文件通常比相同数据集的 RDB 文件大,恢复速度慢于 RDB 文件

 

三、AOF重写机制(AOF 文件压缩)

  随着Redis服务的进行,AOF文件会越来越大,恢复的时间也会越来越长,为了解决上述问题,Redis 增加了重写机制。AOF 文件大小达到设置的峰值,Redis 就会自动对文件进行压缩,只保留可以恢复数据的最小指令集。也可以使用命令bgrewriteaof来重写。

 

  

 

标签:文件,持久,AOF,Redis,命令,RDB,快照,persistence
From: https://www.cnblogs.com/shiguangrusuo/p/18064825

相关文章

  • Redis—集群扩缩容
    Redis可以通过主从节点读写分离来扩展主节点读取能力,那么新增主节点也可以增强数据写入能力。https://zhuanlan.zhihu.com/p/104641341https://www.cnblogs.com/lemon-flm/p/15190528.htmlRedisClusterRedis通过主从复制来扩展主节点的数据读取能力,但是当主节点的写入......
  • 【知识点】Redis-缓存-缓存穿透
    缓存穿透:查询一个不存在的数据,Mysql查询不到也没有写入缓存,导致每次请求都会查询数据库。(比如恶意请求)解决方案:缓存空数据:返回数据为空时仍然缓存(但是需要加过期时间)。优点:简单缺点:消耗内存,可能存在数据不一致情况。布隆过滤器布隆过滤器使用Bitmap(位图)来记载一个数据是......
  • Redis—分布式锁
    单实例的正确实现方式获取锁的正确操作为:SETresource_namemy_random_valueNXPX30000,它限定了只有当锁空闲且持有锁的时间为30000ms,并且锁资源对应的value为一个随机值。设置随机值是为了在释放锁时,确保当前线程能够释放该锁,避免出现操作超时的线程释放了其它线程的锁。......
  • Redis未授权漏洞复现
    目录Redis漏洞的产生条件及利用Redis环境搭建漏洞复现利用Redis写入Webshell利用Redis写入SSH公钥利用Redis写入计划任务Redis安全防护Redisredis(remotedictionaryserver)是一个key-value存储系统,是跨平台的非关系型数据库。redis默认情况下,会绑定在0.0.0.0:6379,如果没有采用......
  • Redis过期删除策略和内存淘汰机制
    过期删除策略1、惰性删除就是过期之后下一次取数据时,发现过期了,就删除它。2、定期删除定期删除一些过期的key。redis采用的时惰性删除+过期删除。问题:可能会漏掉一些key,从而导致OOM。内存淘汰机制3*2+2volatile-lru:从过期数据集中选择最近最少使用的数据淘汰。allKe......
  • Redis数据库的入门学习
     关系型数据库和非关系型数据库的区别:简介Redis数据库和MySql数据库的区别:Redis数据库是基于内存的key-value结构的数据库。本质上是内存存储。而MySql数据库是通过数据文件的方式存在磁盘当中,本质上是磁盘存储。且MySql当中是通过二维表存储数据。注:Redis数据库并不......
  • go~在阿里mse上使用redis.call
    相关依赖github.com/higress-group/proxy-wasm-go-sdkgithub.com/alibaba/higress/plugins/wasm-go标准的redis下面是一个读取redis指定key的方法,使用了higress的wasm-go组件实现的 err:=config.Client.SMembers("online",func(responseresp.Value){ for_,item:=......
  • Redis缓存三兄弟
    Redis缓存的问题都是因为缓存过期,导致大量请求打到数据库,给数据库添加了压力。以下是典型的三个缓存问题。缓存穿透概念缓存穿透:频繁请求缓存和数据库中没有的数据,导致数据库的压力过大解决方案规则校验:增加对key的规则校验,防止恶意请求设默认值:数据库中没有数据时,给该......
  • Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁
    ↑↑↑请在文章开头处下载测试项目源代码↑↑↑文章目录前言4.3优惠券秒杀4.3.4库存超卖问题及其解决4.3.4.1问题分析4.3.4.2问题解决4.3.5一人一单需求4.3.5.1需求分析4.3.5.2代码实现4.3.5.3并发问题4.3.5.4悲观锁解决并发问题4.3.5.5集群环境下的并发问题......
  • 详解 Redis 在 Ubuntu 系统上的安装
    在Ubuntu20.04安装Redis1.先切换到root用户在Ubuntu20.04中,可以通过以下步骤切换到root用户:输入以下命令,以root用户身份登录:sudosu-按回车键,并输入当前用户的密码(即具有sudo权限的用户的密码)如果密码正确,将会切换到root用户,并且提示符会变为以r......