redis持久化操作RDB和AOF详解与操作(docker)

2023-11-06

redis持久化 

Redis 提供了两种不同的持久化方法来将数据存储到硬盘里面。一种方法叫快照(snapshotting,RDB),它可以将存在于某一时刻的所有数据都写入硬盘里面。另一种方法叫只追加文件(append-only file,AOF),它会在执行写命令时,将被执行的写命令复制到硬盘里面。

RDB(redis database)

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里。

  redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。

如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

Fork:Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

  • RDB的开启配置

要启用RDB,需要修改Redis的配置文件redis.conf

#save: 多久执行一次自动快照操作
save 900 1
save 300 10
save 60 1000
save 60 5    #自行测试使用,表示60秒类写入5次的话,redis就会自动触发BGSAVE命令

#stop-writes-on-bgsave-error: 在创建快照失败后是否仍然继续执行写命令
stop-writes-on-bgsave-error no

#rdbcompression: 是否对快照文件进行压缩
    * yes: 开启,这种情况下,Redis会采用LZF算法对rdb文件进行压缩    * no: 关闭
rdbcompression no

#快照文件名
dbfilename dump.rdb
#快照文件存放目录
dir /data/
  • RDB触发条件

RDB的触发条件会比AOF麻烦,大致可以分为以下几种:

① 通过redis-cli等客户端直接发送 BGSAVE 或 SAVE 指令:BGSAVE 会让Redis调用fork创建一个子进程在后台运行,子进程将会负责创建快照到磁盘中,可以通过lastsave命令获取最后一次成功执行快照的时间。;SAVE(与配置文件中的save毫无关系)会让Redis主进程直接开始创建快照,但在创建快照的过程中,Redis不会响应其他命令请求。在docker中启动redis容器后,在redis-cli中输入 “BGSAVE” 或 “SAVE” 后,能够在挂载的data目录下生成一个dump.rdb文件;    
③ 通过配置项```save```进行触发(具体请参照上文的参数说明);

④ 通过SHUTDOWN命令关闭Redis服务器时,Redis会自动触发一个SAVE指令;

⑤ 通过标准TERM信号kill掉Redis服务时,Redis也会自动触发一个SAVE指令;

⑥ 通过Redis主从服务器的复制请求时,会触发一次BGSAVE指令(当且仅当主服务器没有子进程在执行BGSAVE)。

⑦ 执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义。

恢复数据:将备份文件(dump.rbd)移动到redis的启动目录(你在哪个目录下启动的redis,哪个目录就是你的启动目录)下并启动服务即可。config get dir 获取目录】

  • RDB的关闭

① 关闭rdb的命令:redis-cli config set save " "

② 进入配置文件redis.conf将:

Save 900 1      

Save 300 10    

Save 60 10000   

注释掉,并打开save "" 的注释,使得  save " "  生效,即可关闭rdb;

AOF(append-only file)

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

  • AOF的开启配置

AOF的启用配置与RDB一样在redis.conf文件中

#appendonly: 是否启用AOF 
    * yes: 启用AOF    
    * no: 关闭AOF,默认
appendonly no
【注意:在docker中启动redis,所挂载的配置文件中appendonly必须设置为no,否则redis启用后会出现闪退的现象。
    所以docker中要想使用AOF,可以在运行启动redis时加上 --appendonly yes】

#appendfsync: 启用AOF后的数据同步频率
    * alaways: 同步持久化 每次发生数据变更会立即记录到磁盘 性能较差但数据完整性比较好(不建议)    
    * everysec: 每秒执行一次同步,异步操作,如果一秒内宕机有数据丢失(默认的,对性能没有太大影响)    
    * no: 让操作系统来决定应该何时进行同步。(不建议)
appendfsync everysec

#no-appendfsync-on-rewrite:在对AOF进行压缩(也被称为重写机制)的时候能否执行同步操作
    *yes 不允许    *no 允许(默认,保证数据安全性)
no-appendfsync-on-rewrite no

# Auto-aof-rewrite-min-size:设置重写的基准值
  Auto-aof-rewrite-percentage:设置重写的基准值
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
(如果觉得AOF重写执行得过于频繁,我们可以把auto-aof-rewrite-percentage设置100以上,可以适当降低重写频率) 

rewrite:AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof

rewrite(重写)原理:AOF文件秩序增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点相似。

重写触发条件:系统载入时或者上次重写完毕时,Redis会记录此时AOF大小,设为base_size,如果Redis的AOF当前大小>= base_size +base_size*100% (默认)且当前大小>=64mb(默认)的情况下,Redis会对AOF进行重写。

(redis会记录上次重写时的aof大小,默认配置是当aof文件大小时上次rewrite后大小的一倍且文件大于64M时触发) 

  • AOF触发机制

直接根据appendfsync的设置进行触发

  • AOF的关闭

关闭AOF的命令:redis-cli config set appendfsync no 

总结

RDB跟AOF都可以确保Redis的数据持久化,但各有特点:

RDB因为有默认的指令SAVE跟BGSAVE支持,所以适合对数据库做全量备份,比如每天凌晨3点开始执行一次BGSAVE。

AOF因为是保存的写命令,因而更适合实时备份,备份机制更稳健,丢失数据概率更低;可读的日志文本,通过操作AOF稳健,可以处理误操作。事实上现在企业应用也基本都是采用的AOF

AOF比起RDB占用更多的磁盘空间;恢复备份速度要慢;每次读写都同步的话,有一定的性能压力;存在个别Bug,造成不能恢复。

但光是使用了RDB或AOF、甚至两个一起用,也还是不够的,对于一个需要支持可扩展的分布式平台而言,我们还需要提供一套复制备份机制,允许在一个周期内,自动将AOF或者RDB的文件备份到不同的服务器下,这种情况下,我们就需要使用Redis的复制并生成数据副本功能 。

若同时开启 RDB 和 AOF:

AOF优先,RDB与AOF同时开启 默认无脑加载AOF的配置文件
       相同数据集,AOF文件要远大于RDB文件,恢复速度慢于RDB
       AOF运行效率慢于RDB,但是同步策略效率好,不同步效率和RDB相同

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis持久化操作RDB和AOF详解与操作(docker) 的相关文章

  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • 如何将 ActionController::Live 与 Resque + Redis 一起使用(用于聊天应用程序)

    我正在尝试为我的 Rails 应用程序构建聊天功能 我在用ActionController Live Puma Resque Redis为了这 所以基本上在这种情况下 redissubscribe方法正在后台运行 使用resque 到目前为
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • docker-compose:容器之间的 Redis 连接被拒绝

    我正在尝试设置一个 docker compose 文件 该文件旨在替换运行多个进程 RQ 工作线程 RQ 仪表板和 Flask 应用程序 的单个 Docker 容器解决方案导师 http supervisord org 主机系统是 Debi
  • Spring Redis 排序键

    我在 Redis Spring Data Redis 中有以下键 localhost gt Keys 1 id 1 Name C5796 Site DRG1 2 id 2 Name CX1XE Site DG1 3 id 3 Name C5

随机推荐

  • nginx重启报找不到nginx.pid的解决方法

    nginx被停止 nginx s stop 或者直接杀掉了进程 kill 9 nginx的进程号 后 调用命令 nginx s reload 或者 nginx s reopen 会报错 无法找到 var run nginx pid 文件 这
  • 以树状结构显示文件夹

    以树状结构显示文件夹 题目要求 编写程序 在命令行中以树状结构显示特定的文件夹及其子文件夹 如果子文件是文件则需要显示文件大小 最后统计整个目录的大小 public class Test static long fileNum 0 stat
  • 华为OD机试 C++ 报数问题

    题目 你和你的朋友们围成一个圈玩游戏 从第一个人开始 依次报数 1 2 3 当数到3的时候 那个人就得退出游戏 然后从他的下一个朋友继续开始 1 2 3 同样的 数到3的人又得退出 这样一直进行下去 直到圈里只剩下一个人 人会是谁 任务 给
  • Android Studio更新升级方法

    android studio一直在更新完善 为了与时俱进 我们当然要将工具更新到最新版本啦 其实更新本来是很简单 只要从Android Studio Help菜单中选择Check for Update即可 但因为 伟大的墙 实际更新失败 下
  • JS浏览器调试:Browser对象

    好久不搞前端 最近在搞钉钉的第三方应用的时候 前端给我露了一手 涉及到知识主要是JavaScript的Browser对象 首先现在很多PC客户端现在技术选型选择会选择nodejs这类 像nw js或者Electron 都会涉及到chromi
  • 给input框赋值成功后input框不能进行编辑

    选中一项后 input框不能进行编辑
  • 【工具】(z-library平替)Clibrary中文图书馆,电子书大全

    目录 新版目录 更新于2023 7 11 一 更新时间和简介 二 步骤 老版目录 接口无法使用 1 z library和Clibrary简介 2 Clibrary网址 3 具体操作界面 新版目录 更新于2023 7 11 一 更新时间和简介
  • three.js 制作地球标注的两种方法

    一 Sprite精灵标签 效果图 精灵标签 标签永远面向相机 function createTxt position name var texture new THREE CanvasTexture getCanvasFont var fo
  • 自学——一个月入门前端④

    本文的内容有关css盒模型 盒模型 在css中 所有的元素都被一个个的 盒子 包围着 广泛的使用两种盒子 块级盒子和内联盒子 这两种盒子会在页面流和元素之间的关系 block 绝大部分情况下盒子会和父容器一样宽 每个盒子都会换行 width
  • C/C++判断指针是否为空

    if p NULL if NULL p if p nullptr if nullptr p if p 0 if 0 p if p false if false p if p 个人理解 如有不对 敬请指正 最佳判断是if p 因为 p是一个指
  • 02-分布式协调服务ZooKeeper

    目录 一 ZooKeeper简介 1 什么是Zookeeper 2 基本特性 二 ZooKeeper原理 1 系统架构 1 1 角色分工 1 2 设计思想 1 3 为什么要引入Observer ZK 3 3 0 2 数据模型 2 1 Zno
  • 花书+吴恩达深度学习(二六)近似推断(EM, 变分推断)

    文章目录 0 前言 1 将推断视为优化问题 1 1 期望最大化 EM 1 2 最大后验推断 MAP 1 3 稀疏编码 2 变分推断 2 1 离散型潜变量 2 2 连续性潜变量 如果这篇文章对你有一点小小的帮助 请给个关注 点个赞喔 我会非常
  • 【Redis】持久化之AOF

    Redis持久化之AOF 以日志的形式来记录每个写操作 增量保存 将Redis执行过的所有写指令记录下来 读操作不记录 只许追加文件但不可以改写文件 redis启动之初会读取该文件重新构建数据 换言之 redis 重启的话就根据日志文件的内
  • 【element】之el-popconfirm:弹出组件确认按钮绑定

    element之el popconfirm 弹出组件确认按钮绑定 一 element官网说明 element中el popconfirm实例 element提供的接口 二 实际代码说明 无用代码 正确代码 一 element官网说明 ele
  • 通过bilibili_api获取bilibili弹幕+绘制词云的方法!

    由于自己学艺不精 后续词云的简略代码没怎么看懂 梳理了一遍把整个的学习内容记录下来 主要参考的为bilibili api的教程和词云的生成教程 https blog csdn net itanders article details 888
  • 华为b6手环能升级鸿蒙吗,华为手环B6全新发布:跨界形态再升级 强劲性能革新穿戴体验...

    2020年7月30日 北京 今日 华为正式推出了融合耳机和手环形态的跨界穿戴智能手环华为手环B6 它采用1 53英寸高清3D弧面柔性屏 外观时尚 操控自如 独创的分离式设计 让这款产品兼具蓝牙耳机的舒适佩戴和华为智能手环的专业运动健康功能
  • [Ubuntu] [Qt] Ubuntu18.04.6安装Qt后打不开

    1 安装完Qt5 15 2后点击图标没反应 2 通过指令打开Qt 可以看到失败的原因是因为glibc 2 28没找到 Qt Tools QtCreator bin qtcreator software Qt Tools QtCreator
  • labelimg 修正模型错误标注遇到的问题

    场景介绍 使用了 模型 如YOLOv5 v7 detec py 保存的 YOLO 格式的结果 包括测试的图像和对应的 txt 文件 模型跑出来的结果可能不够准确 需要手工修正下 因此我需要使用 labelimg 来可视化图像 并且修改其标注
  • Tomcat安装版和解压版

    在eclipse中开发web项目经常需要在eclipse中添加tomcat服务器 之前下载了目前最新版本tomcat9的zip版 由于目前的eclipse只支持到tomcat8 原本准备就这样安装了 在浏览器输入了n次http localh
  • redis持久化操作RDB和AOF详解与操作(docker)

    redis持久化 Redis 提供了两种不同的持久化方法来将数据存储到硬盘里面 一种方法叫快照 snapshotting RDB 它可以将存在于某一时刻的所有数据都写入硬盘里面 另一种方法叫只追加文件 append only file AO