Redis持久化RDB和AOF、事务管理

2023-05-16

详解配置文件redis.conf 常用的配置:https://blog.csdn.net/weixin_45606067/article/details/107917743

五、Redis的持久化

1、RDB(Redis DataBase)

1、是什么

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

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

Rdb 保存的是dump.rdb文件

2、Fork

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

3、配置位置

具体参照redis.conf配置文件中的 APPEND ONLY MODE追加
在这里插入图片描述
具体配置看【5、SNAPSHOTTING快照】:https://blog.csdn.net/weixin_45606067/article/details/107917743

4、如何触发RDB快照

  • 配置文件中默认的快照配置
    在这里插入图片描述

  • 命令save或者是bgsave

    • SAVE:save时只管保存,其它不管,全部阻塞。
    • BGSAVE:Redis会在后台异步进行快照操作,
      快照同时还可以响应客户端请求。可以通过lastsave
      命令获取最后一次成功执行快照的时间
  • 执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义

5、如何恢复

  • 将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。
  • CONFIG GET dir获取目录。

6、优势

  • 适合大规模的数据恢复。
  • 对数据完整性和一致性要求不高。

7、劣势

  • 在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
  • Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。

9、如何停止

动态所有停止RDB保存规则的方法:redis-cli config set save “”

10、小总结

在这里插入图片描述

2、AOF(Append Only File)

1、是什么

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

Aof保存的是appendonly.aof文件

2、配置位置

具体参照redis.conf配置文件中的 SNAPSHOTTING快照

在这里插入图片描述

3、AOF启动/修复/恢复

  • 正常恢复

    • 启动:设置Yes

      修改默认的appendonly no,改为yes

    • 将有数据的aof文件复制一份保存到对应目录(config get dir)

    • 恢复:重启redis然后重新加载

  • 异常恢复

    • 启动:设置Yes

      修改默认的appendonly no,改为yes

    • 备份被写坏的AOF文件

    • 修复:

      Redis-check-aof --fix 进行修复(dump的修复也类似)
      在这里插入图片描述

    • 恢复:重启redis然后重新加载

4、Rewrite

  • 是什么:

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

  • 重写原理

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

  • 触发机制

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

5、优势

  • 每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
  • 每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
  • 不同步:appendfsync no 从不同步

6、劣势

  • 相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
  • Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

7、小总结

在这里插入图片描述

3、总结(Which one)

  • RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储

  • AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。
    Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

  • 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。

  • 同时开启两种持久化方式

    • 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
    • RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?
      建议不要
      ,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。
  • 性能建议

    因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。

    如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。

    如果不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。新浪微博就选用了这种架构

六、Redis的事务

1、是什么

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞

2、能干什么

一个队列中,一次性、顺序性、排他性的执行一系列命令。

3、怎么玩

  • 常用命令
    在这里插入图片描述

  • Case1:正常执行
    在这里插入图片描述

  • Case2:放弃事务
    在这里插入图片描述

  • Case3:全体连坐
    在这里插入图片描述

  • Case4:冤头债主
    在这里插入图片描述

  • Case5:watch监控

    • 悲观锁/乐观锁/CAS(Check And Set)

      • 悲观锁

        悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

      • 乐观锁

        乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,

        乐观锁策略:提交版本必须大于记录当前版本才能执行更新

      • CAS

    • 初始化信用卡可用余额和欠额
      在这里插入图片描述

    • 无加塞篡改,先监控再开启multi,保证两笔金额变动在同一个事务内
      在这里插入图片描述

    • 有加塞篡改

      监控了key,如果key被修改了,后面一个事务的执行失效
      在这里插入图片描述

    • unwatch
      在这里插入图片描述

    • 一旦执行了exec之前加的监控锁都会被取消掉了

    • 小结

      Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。

      通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回 Nullmulti-bulk 应答以通知调用者事务执行失败

4、3阶段

  • 开启:以 MULTI 开始一个事务
  • 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
  • 执行:由EXEC命令触发事务

5、3特性

  • 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题
  • 不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

Linux命令补充 :

看内存 :free

看磁盘空间:df -h


如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis持久化RDB和AOF、事务管理 的相关文章

  • 找不到模块“socket.io/node_modules/redis”

    当尝试做的时候 var redis require socket io node modules redis 我收到错误 找不到模块 socket io node modules redis 我不明白为什么 我正在运行 Windows 并运
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • Redis部署配置-主从复制

    目前我有两台服务器 我已经部署了基于node js Express JS的Web服务API 我正在使用 Redis 来缓存 JSON 字符串 将此设置部署到生产中的最佳选择是什么 我懂了here https stackoverflow co
  • 如何在redis中创建自己的数据库?

    There are 0 to 15 databases in redis 我想使用 redis cli 创建自己的数据库 有什么命令可以实现吗 Redis 数据库并不等同于 MySQL 等 DBMS 中的数据库名称 这是一种为键创建隔离和命
  • 如何从 python 将无穷大传递给 redis?

    我正在使用 redis py 并希望将 inf 和 inf 与 ZRANGEBYSCORE 一起使用 我尝试使用 inf 的字符串和浮点来执行此操作 但它们返回一个空集 我怎样才能做到这一点 EDIT 我尝试执行以下命令 redis Str
  • python 3.5 中的 json.loads 和 Redis

    我使用 json dumps 创建了一个 JSON 对象 并在 Redis 列表中将其 RPUSH ed 当使用 LRANGE redis lrange 返回 JSON 时 我收到一个二进制字符串 b si 00 ff 所以 json lo
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • 如何在多个Lua State(多线程)之间传递数据?

    我在中启动Redis连接池redis lua 通过从 C 调用 我得到了redis lua state 此 Lua 状态全局启动一次 仅在其他线程中启动get从中 当有一个 HTTP 请求 工作线程 时 我需要从redis lua stat
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • Caffeine Expiry 中如何设置多个过期标准?

    我正在使用 Caffeine v2 8 5 我想创建一个具有可变到期时间的缓存 基于 值的创建 更新以及 该值的最后一次访问 读取 无论先发生什么都应该触发该条目的删除 缓存将成为三层值解析的一部分 The key is present i
  • 通过 StackExchange.Redis 连接到 Redis Servier

    我尝试使用以下方法制作一个测试项目Redis https redis io服务器 通过 Virtual Box 安装在 Linux Ubuntu 虚拟机上 Linux 机器通过 Virtual Box 的桥接适配器与本地网络连接 Virtu
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • Redis+Docker+Django - 错误 111 连接被拒绝

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

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

随机推荐

  • Vue:MVVM模式和第一个Vue程序

    什么是 MVVM MVVM xff08 Model View ViewModel xff09 是一种软件架构设计模式 xff0c 由微软 WPF xff08 用于替代 WinForm xff0c 以前就是用这个技术开发桌面应用程序的 xff
  • Vue:基础语法

    文章目录 v bindv if v elsev else ifv forv onv on clickv on keydownv on mouseover v text与v htmlv model v bind 我们已经成功创建了第一个 Vu
  • Vue:表单双绑、组件

    什么是双向数据绑定 Vue js 是一个 MVVM 框架 xff0c 即数据双向绑定 xff0c 即当数据发生变化的时候 xff0c 视图也就发生变化 xff0c 当视图发生变化的时候 xff0c 数据也会跟着同步变化 这也算是 Vue j
  • Vue:Axios异步通信、生命周期

    什么是Axios Axios 是一个开源的可以用在浏览器端和 NodeJS 的异步通信框架 xff0c 她的主要作用就是实现 AJAX 异步通信 xff0c 其功能特点如下 xff1a 从浏览器中创建 XMLHttpRequests从 no
  • mysql架构简介、及linux版的安装

    一 mysql的架构介绍 1 mysql简介 1 概述 MySQL是一个关系型教据库管理系统 xff0c 由瑞典MySQL AB公司开发 xff0c 目前属于Oracle公司 MySQL是一种关联歌据库管理系统 xff08 RDBMS xf
  • PyTorch:torch.sort()

    作用 xff1a 对给定tensor的指定维度进行排序 xff0c 返回排序后的结果和排序后的值对应原来维度位置的序号 举例说明 xff1a import torch a 61 torch randint 2 10 6 4 创建shape为
  • mysql索引、索引优化(这一篇包括所有)

    二 索引优化分析 1 性能下降SQL慢 执行时间长 等待时间长 查询语句写的烂索引失效 单值复合 关联查询太多Join xff08 设计缺陷或不得已的需求 xff09 服务器调优及各个参数设置 xff08 缓冲 线程数等 xff09 2 常
  • 查询截取分析

    三 查询截取分析 1 查询优化 1 永远小表驱动大表 xff0c 类似嵌套循环Nested Loop Case EXISTS SELECT FROM table WHERE EXISTS subquery 该语法可以理解为 xff1a 将主
  • mysql锁机制,主从复制

    四 mysql锁机制 1 概述 1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制 在数据库中 xff0c 除传统的计算资源 xff08 如CPU RAM I O等 xff09 的争用以外 xff0c 数据也是一种供许多用户共享的
  • Linux的安装、目录结构介绍,以及Xshell5远程连接

    一 Linux 介绍 1 Linux课程的内容介绍 2 Linux的应用领域 2 1 个人桌面应用领域 此领域是传统 linux应用最薄弱的环节 xff0c 传统 linux由于界面简单 操作复杂 应用软件少的缺点 xff0c 一直被 wi
  • vim编辑器、用户管理常见命令

    Linux的安装 目录结构介绍 xff0c 以及shell5 远程连接 xff1a https blog csdn net weixin 45606067 article details 107834549 一 vi和 vim编辑器 1 v
  • Linux最全命令总结【有代码演示,没有之一】

    文章目录 一 实用指令1 指定运行级别2 切换到指定运行级别的指令3 帮助指令3 1 介绍3 2 man获得帮助信息3 3 help指令3 4 当一个指令不熟悉如何学习的建议 4 文件目录类4 1pwd指令4 2 ls指令4 3 cd指令4
  • Linux中的任务调度、磁盘分区与挂载、网络配置、进程管理、RPM和YUM

    文章目录 一 crond任务调度1 概述2 基本语法3 快速入门任务的要求步骤如下参数细节说明 4 任务调度的几个应用实例案例1案例 2案例 3 5 crond相关指令 二 Linux磁盘分区 挂载1 分区基础知识分区的方式windows下
  • Shell编程

    一 Shell编程 1 为什么要学习 Shell编程 1 xff09 Linux运维工程师在进行服务器集群管理时 xff0c 需要编写 Shell程序来进行服务器管理 2 xff09 对于 JavaEE和 Python程序员来说 xff0c
  • github上开源模板、开源项目【总结全面,值得一看】

    给大家分享一些 github 码云 上开源学习网站 以及对于后端程序员来说前端页面模板是很发愁的 xff0c 这里供大家写项目的时候用 希望这篇文章对大家的学习有帮助 3个快速开发平台 1 Jeecg boot 前端采用阿里ant desi
  • Redis在Linux中详细安装、Nosql概述

    一 NoSql入门和概述 1 入门概述 1 互联网时代背景下 xff0c 为什么用nosql xff1f 1 单机Mysql的美好时代 一个网站的访问量一般都不大 xff0c 用单个数据库完全可以轻松应对 在那个时候 xff0c 更多的都是
  • PyTorch:torch.max、min、argmax、argmin

    目录 1 torch max 2 torch argmax 3 torch min 4 torch argmin 1 torch max 函数定义 xff1a torch max input dim max 61 None max indi
  • HTML 的嵌套规则

    标签是文本标签 xff0c 一般嵌套用文本 1 a标签最好不要嵌套块级元素 xff0c 可以嵌套内联元素 xff0c 但是不能嵌套a标签和input之类的标签 能嵌套的标签像 等等 2 ul和ol的子元素不能是别的元素只能是li xff0c
  • Redis数据类型【详解有演示】

    Redis在Linux中详细安装 Nosql概述 xff1a https blog csdn net weixin 45606067 article details 107904512 三 Redis数据类型 1 Redis的五大数据类型
  • Redis持久化RDB和AOF、事务管理

    详解配置文件redis conf 常用的配置 xff1a https blog csdn net weixin 45606067 article details 107917743 五 Redis的持久化 1 RDB xff08 Redis