11.redis持久化

news2024/11/25 0:47:27

1.redis持久化

        Redis的所有数据都是保存在内存中,因此redis重启后数据就丢失了,所以需要不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);或者把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

        redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时 dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。

2.redis持久化-RDB

        在指定的时间间隔能对你的数据进行快照存储。(默认开启)

2.1 持久化配置

        输入命令查看配置

vi /usr/local/redis/redis.conf

        RDB的持久化配置

# 时间策略
save 900 1
save 300 10
save 60 10000
​
# 文件名称
dbfilename dump.rdb
​
# 文件保存路径  redis.conf所在目录下
dir ./
​
# 导入时是否检查
rdbchecksum yes

配置解释

  • save 900 1 表示900s内如果有1条是写入命令,就触发产生一次快照,可以理解为就进行一次备份

  • save 300 10 表示300s内有10条写入,就产生快照

        那么为什么需要配置这么多条规则呢?因为Redis每个时段的读写请求肯定不是均衡的,为了平衡性能与数据安全,我们可以自由定制什么情况下触发备份。所以这里就是根据自身Redis写入情况来进行合理配置。

        当然如果想要禁用RDB配置,也是非常容易的,只需将save 900 1等注释起来,然后在save的最后一行写上:save ""

image-20211019170808587

        修改时间配置

image-20211019170821086

        修改完之后一定要重启redis,输入shutdown停止redis服务器,然后进入/usr/local/redis/目录输入以下命令重启redis

redis-server ./redis.conf

2.2 RDB的原理

在Redis中RDB持久化的触发分为两种:自己手动触发与Redis定时触发。

针对RDB方式的持久化,手动输入以下命令完成手动持久化:

  • save:会阻塞当前Redis服务器,直到持久化完成,线上应该禁止使用。

  • bgsave:该触发方式会fork一个子线程,由子进程负责持久化过程,因此阻塞只会发生在fork子进程的时候。

而自动触发的场景主要是有以下几点:

  • 根据我们的 save m n 配置规则自动触发;

  • 从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发 bgsave;

  • 执行 debug reload 时;

  • 执行 shutdown时,如果没有开启aof,也会触发。

由于 save 基本不会被使用到,我们重点看看 bgsave 这个命令是如何完成RDB的持久化的。

image-20211019171019469

这里注意的是 fork 操作会阻塞,导致Redis读写性能下降。我们可以控制单个Redis实例的最大内存,来尽可能降低Redis在fork时的事件消耗。

3.redis持久化-AOF

        记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。(默认关闭)

3.1 AOF的配置

        AOF是redis的一种持久化方式,用来记录所有的写操作,但是随着时间增加,aof文件会越来越大,所以需要进行重写,将内存中的数据重新以命令的方式写入aof文件。

        在重写的过程中,由于redis还会有新的写入,为了避免数据丢失,会开辟一块内存用于存放重写期间产生的写入操作,等到重写完毕后会将这块内存中的操作再追加到aof文件中。

image-20211019171041836

# 是否开启aof
appendonly yes
​
# 文件名称
appendfilename "appendonly.aof"
​
# 同步方式
appendfsync everysec
​
# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

配置解释

  • appendfsync everysec 它其实有三种模式:

    always 把每个写命令都立即同步到aof,很慢,但是很安全

    everysec 每秒同步一次,是折中方案

    no redis不处理交给OS来处理,非常快,但是也最不安全

一般情况下都采用 everysec 配置,这样可以兼顾速度与安全,最多损失1s的数据。

  • auto-aof-rewrite-percentage 是设置aof rewrite触发时机的一个参数,当当前的aof文件大小超过上一次rewrite后aof文件的百分比后触发rewrite

    例如将100改为800 ,即当前的aof文件超过上一次重写后aof文件的8倍时才会再次rewrite,这样可以保证短期内不会再次进行重写操作。

  • auto-aof-rewrite-min-size

    aof文件重写最小的文件大小,即最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小).此变量仅初始化启动redis有效.如果是redis恢复时,则lastSize等于初始aof文件大小.

修改之后要重启redis

向redis中添加一些key-value

然后在redis文件夹下查看是否有appendonly.aof文件

image-20211019171201896

可以删除appendonly.aof文件,然后在重启redis看看数据有哪些

3.2 AOF的原理

        由于AOF 文件都是追加的,随着服务器的运行 AOF 文件会越来越大,体积过大的 AOF 文件对 redis 服务器甚至是主机都会有影响,而且在 Redis 重启时加载过大的 AOF 文件需要过多的时间,这些都是不友好的,那 Redis 是如何解决这个问题的呢?Redis 引入了重写机制来解决 AOF 文件过大的问题。

        AOF的整个流程大体来看可以分为两步,一步是命令的实时写入(如果是 appendfsync everysec 配置,会有1s损耗),第二步是对aof文件的重写。

        对于增量追加到文件这一步主要的流程是:命令写入→追加到aof_buf→同步到aof磁盘。那么这里为什么要先写入buf在同步到磁盘呢?如果实时写入磁盘会带来非常高的磁盘IO,影响整体性能。

        Redis AOF 文件重写是把 Redis 进程内的数据转化为写命令同步到新 AOF 文件的过程,重写之后的 AOF 文件会比旧的 AOF 文件占更小的体积,这是由以下几个原因导致的:

  • 进程内已经超时的数据不再写入文件

  • 旧的 AOF 文件含有无效命令,如 del key1、hdel key2、srem keys、set a111、set a222等。重写使用进程内数据直接生成,这样新的AOF文件只保 留最终数据的写入命令

  • 多条写命令可以合并为一个,如:lpush list a、lpush list b、lpush list c可以转化为:lpush list a b c。为了防止单条命令过大造成客户端缓冲区溢 出,对于 list、set、hash、zset 等类型操作,以64个元素为界拆分为多条。

        重写之后的 AOF 文件体积更小了,不但能够节约磁盘空间,更重要的是在 Redis 数据恢复时,更小体积的 AOF 文件加载时间更短。AOF 文件重写跟 RDB 持久化一样分为手动触发和自动触发,手动触发直接调用 bgrewriteaof 命令就好了,我们后面会详细聊一聊这个命令,自动触发就需要我们在 redis.conf 中修改以下几个配置

auto-aof-rewrite-percentage 800

auto-aof-rewrite-min-size 64mb

  • auto-aof-rewrite-percentage:代表当前 AOF文件空间 (aof_current_size)和上一次重写后 AOF 文件空间(aof_base_size)的比值,默认是 100%,也就是一样大的时候

  • auto-aof-rewrite-min-size:表示运行 AOF 重写时 AOF 文件最小体积,默认为 64MB,也就是说 AOF 文件最小为 64MB 才有可能触发重写

满足了这两个条件,Redis 就会自动触发 AOF 文件重写,AOF 文件重写的细节跟 RDB 持久化生成快照有点类似,下面是 AOF 文件重写流程图:

image-20211019171248386

  • 在重写期间,由于主进程依然在响应命令,为了保证最终备份的完整性;因此它依然会写入旧的AOF file中,如果重写失败,能够保证数据不丢失。

  • 为了把重写期间响应的写入信息也写入到新的文件中,因此也会为子进程保留一个buf,防止新写的file丢失数据。

  • 重写是直接把当前内存的数据生成对应命令,并不需要读取老的AOF文件进行分析、命令合并。

  • AOF文件直接采用的文本协议,主要是兼容性好、追加方便、可读性高可认为修改修复。

不论是RDB还是AOF都是先写入一个临时文件,然后通过 rename 完成文件的替换工作。

4. RDB与AOF的区别

4.1 RDB优点

  • 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

  • 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

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

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

4.2 RDB缺点

  • 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

  • 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

4.3 AOF的优点

  • 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变 化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。

  • 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof(./redis-check-aof --fix appendonly.aof)工具来帮助我们解决数据一致性的问题。

  • 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

  • AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

4.4 AOF的缺点

  • 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

  • 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

        二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Exploring Lottery Prompts for Pre-trained Language Models

Exploring Lottery Prompts for Pre-trained Language Models 文章链接 清深的工作,比较有意思的一篇。作者先给出假设,对于分类问题,在有限的语料空间内总能找到一个prompt让这个问题分类正确,作者称之为lottery prompt。为此&…

Rust常用加密算法

哈希运算(以Sha256为例) main.rs: use crypto::digest::Digest;use crypto::sha2::Sha256;fn main() { let input "dashen"; let mut sha Sha256::new(); sha.input_str(input); println!("{}", sha.result_str());} Cargo.toml: [package]n…

Python中实例方法、类方法、静态方法的区别与作用

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 Python中至少有三种比较常见的方法类型,即实例方法,类方法、静态方法。 它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文。 首先&#xf…

pdf.js构建时,报Cannot read property ‘createChildCompiler‘ of undefined #177的解决方法

在本地和CI工具进行构建时,报如下错误。 Cannot read property createChildCompiler of undefined #177解决方法: 找到vue.config.js,在 module.exports {parallel: false, //新增的一行chainWebpack(config) {....config.module.rule(&…

MySQL数据库管理高级语句

数据表高级操作 复制表及内容 #复制表及内容create table copy1 like zh1 ; #复制格式,通过LIKE方法,复制zh1表结构生成copy1表 insert into copy1 select * from zh1; #备份内容 克隆表 克隆表,将数据表的数据记录生成到新的表中C…

5个能提高效率的在线设计工具,真的很好用!

随着设计工作的不断变化,能在线使用的设计工具就成了设计师更需要的设计工具,它体量小,使用方便,不尽能帮助设计师完成正常的设计工作,还可以给设计师带来舒适的使用体验,今天本文收集整理了5款好用的在线设…

免费照片转绘画风格软件-FotoSketcher

FotoSketcher一款免费照片转绘画风格软件,只需点击几下鼠标即可自动将照片转换为艺术作品。支持从铅笔素描到水彩画或油画、钢笔画、墨水画、抽象艺术和卡通画,有 20 多种不同的风格可供选择,工具还可以修改原始照片增强对比度、锐化、简化图…

hive问题总结

往往用了很久的函数却只知道其单一的应用场景,本文将不断完善所遇到的好用的hive内置函数。 1.聚合函数或者求最大最小值函数搭配开窗函数使用可以实现滑动窗口 例: SELECT event,time,session_id,COLLECT_LIST(event) OVER (PARTITION BY session_id …

日本核污水今日入海,这帮黑客怒了!

自2011年东日本大地震以来,日本谋划已久的福岛核电站核污水排海计划已于8月24日下午起正式施行,预计排污周期长达30年,整个海洋及其生物都有可能遭受难不可逆的毁灭性打击。 据现场媒体报道,经过17分钟的流淌,核污染水…

Arduino程序设计(四)按键消抖+按键计数

按键消抖按键计数 前言一、按键消抖二、按键计数1、示例代码2、按键计数实验 参考资料 前言 本文主要介绍两种按键控制LED实验:第一种是采用软件消抖的方法检测按键按下的效果;第二种是根据按键按下次数,四个LED灯呈现不同的流水灯效果。 一…

mysql的登录与退出

mysql是c/s架构,意味着同时要有客户端和服务端 1 找到客户端。mysql.exe的安装目录 打开命令行 2 输入对应的服务器的ip,如果是本地,就是Localhost,如果是远程服务器,那就输入对应ip/域名。并且指定mysql监听的端口 …

10大开源工具,每个开发者都应该知道

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

通过仿真理解RLC串联电路和RLC并联电路的阻抗、导纳、品质因数等概念

一.RLC串联电路 1.阻抗 CSDN编辑公式太难受了。。。直接上PPT~ 2.RLC串联电路阻抗的仿真分析 仿真与理论计算,还是有些误差存在的。 二.RLC并联电路 1.导纳 2.RLC并联电路阻抗的仿真分析 3.RLC并联电路的“虚断”特性 三、LC电路的作用 四、品质因子Q 1.RLC串…

【keepalived双机热备与 lvs(DR)】

目录 一、概述 1.简介 2.原理 3.作用 二、安装 1.配置文件 2.配置项 三、功能模块 1.core 2.vrrp 3.check 四、配置双机热备 1.master 2.backup 五、验证 1.ping验证 2.服务验证 六、双机热备的脑裂现象 七、keepalivedlvs(DR) 1.作…

C++11特性详解

一、简介 在C11标准出来之前,一直是C98/03标准占引领地位,而C98/03标准是C98标准在2003年将存在的一些漏洞进行了修复,但并没有核心语法的改动。相比于C98/03,C11则带来了数量可观的变化,其中包含了约140个新特性&…

通过Putty对Linux服务器进行文件的上传与下载

1、下载安装Putty,下载地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 2、打开cmd窗口,通过命令行进入安装路径,如: 3、上传文件 pscp 文件 用户名服务器ip:目录使用“ -l ”选项可以指定用户…

keepalived+lvs(DR)

目录 一,作用 二,调度器配置 1,安装keepalived 2, 安装ipvsadm 3, 配置keepalived 4. 查看lvs节点状态 5, web节点配置 1.1 调整ARP参数 1.2 配置虚拟IP地址 1.3添加回环路由 1.4安装nginx并写…

【Unity学习笔记】DOTween(2)官方案例

本文中大部分内容学习来自DOTween官方文档 此处无法展示动图(懒得录GIF),请下载官方案例场景自行学习 文章目录 场景1 基本补间场景2 动态补间场景3 Shader修改场景4 路径拟合运动场景5 序列播放场景6 UGUI 场景1 基本补间 案例一展示了最基…

技术博客写作「个人经验分享」

技术博客写作「个人经验分享」 仔细想来,从19年我刚开始试着技术写作算起,已经过去了好几年时间。刚好趁着这次的[赠送奖牌活动(奖牌很好看,我很想要hhh😂)],来分享一下我关于技术博客写作的一些个人经验~ 文章目录 技术博客写作「…

k8s 常用命令(四)

12、删除pod中的nginx服务及service [rootmaster ~]# kubectl delete deployment nginx -n kube-public [rootmaster ~]# kubectl delete svc -n kube-public nginx-service 13、查看endpoint的信息 [rootmaster ~]# kubectl get endpoints 14、修改/更新(镜像、…