wordpress 数据库用户/seo 是什么
redis的持久化指将数据写入可靠内存中,如ssd。Redis提供了4种持久化策略
- RDB:Redis Database,周期性的将某个时间点的数据集快照持久化
- AOF:Append Only File,每次redis服务接收到写操作(修改内存的操作),都会将命令写入文件,这些操作可以在redis重启后被重新执行来重建数据集。这些指令的存储格式和redis本身的协议相同。
- No persistence:不进行持久化,在某些缓存情况下使用。
- RDB+AOF:两种持久化策略可以组合使用。
RDB优点
- RDB文件是一个紧凑的单个文件,十分适合做备份。比如可以在24小时内每个小时都归档rdb文件,并且在30天内每天都保存rdb快照,这样在恢复的时候可以选择不同版本的数据。
- RDB适合做灾备恢复,一个单个紧凑的文件很容易转储到其他数据中心,或者存储在云平台上。
- RDB最大限度提升redis性能,在持久化过程种redis主进程只需要fork一个子进程,剩余的持久化工作都由子进程来完成,主进程永远不会执行磁盘I/O等操作。
- 相比于AOF,RDB的重启恢复更快
- 在主备模式下,RDB支持重启和故障切换后的部分重新同步。
RDB的缺点
- 如果你想在redis故障的时候最小化数据丢失,RDB不适合。你可以设置不同的保存点(例如至少5分钟和100次写操作之后保存)。但是通常我们的保存间隔不会太短,所以redis宕机之后可能会丢失几分钟的数据。
- RDB会经常使用fork来创建子进程。如果数据集过大的话fork可能会占用较多时间。如果数据集较大且cpu性能不好的话可能会造成redis的短暂不可用。AOF也需要fork但是频率较低。
AOF优点
- AOF更加可靠,aof可以设置不同的fsync(刷盘)策略:1.不刷盘,缓冲区满自动刷盘,2.每秒刷盘,3.每次请求都刷盘。默认策略是每秒刷盘,写入性能依旧很高。fsync是由后台线程进行的,在未执行fsync的时候主线程会持续的执行写入,因此最多丢失1秒的数据。
- AOF是追加日志文件,因此不需要磁盘寻址,断电等情况下也不会造成数据错乱。即使日志中最后保存的指令只写入了一半,redis-check-aof也能修复。
- 当AOF文件过大的时候,redis会在后台自动重写AOF文件。AOF重写是完全安全的,因为在创建新aof文件(根据当前数据集)的同时,redis还会持续写入到旧文件,一旦写入完成redis就会切换两个文件,并开始在新文件上追加日志。
- AOF文件包含一条接一条的指令,这些指令非常容易理解和解析,也很容易导出。如果你不小心flushall了所有数据,只要还没发生重写,你就可以停掉redis,并删除aof文件最后的flushall指令,然后重启redis就可以恢复所有数据。
AOF缺点
- AOF通常比RDB更大
- 根据刷盘策略的不同,AOF可能比RDB更慢。通常设置每秒刷盘的情况下性能依旧很高,如果设置不刷盘则理论上和RDB一样快,即使是在高负载下。但是RDB可以保证最大延迟。
如果redis版本<7.0
- AOF可能占用很多内存,在重写时新的写入指令会保存在内存缓存中,并在新文件创建完成后追加到末尾。
- 重写期间所有的写入指令都会在磁盘上写入两次。
- redis可能会停止写入并将这些写入指令刷到新的aof文件中。
应该使用哪种
一般情况下,如果你希望有PostgreSql一样的数据安全性的话,你应该两种都使用。
如果你很关心你的数据,但是可以忍受几分钟的数据丢失的话,可以单独使用RDB。
很多用户单独使用AOF,但是我们不建议这样做。因为用RDB做数据备份、快速启动恢复很好,也可以防止AOF引擎出现错误。
快照
默认情况下,RDB将数据集快照存储在磁盘上的dump.rdb文件中。你可以设置rdb在至少有M个key发生变化时每N秒保存一次,或者可以使用save或bgsave命令手动调用保存。
例如,这个命令表示如果至少有1000个key发生变化,每60秒保存一次
save 60 1000
实现原理
- fork一个子进程
- 子进程开始将数据写入到临时文件中
- 当子进程完成新的rdb文件的写入后,用新文件替换旧文件
这种方法可以让redis使用写时复制技术。
写时复制指的是对于一个文件对象,不同的进程映射到虚拟地址空间的都是同一个物理内存,只有某个进程试图修改数据时,才会在物理内存中拷贝一份数据。
追加文件
快照并不是很可靠。如果你的redis服务停止了,或者断电了,或者你不小心杀掉了进程,那么最近的数据就会丢失。虽然对某些应用来说问题不大,但是有些应用缺不能接收,所以单独使用RDB不得行。
AOF是一个完全可靠的持久化方案,在1.1版本中推出。
你可以在配置文件中打开AOF
appendonly yes
现在开始,每次redis接收到一个写指令的时候都会追加到aof文件中。当你重启redis的时候就会重新执行aof文件来恢复到之前的状态。
从7.0开始,redis使用多个aof文件机制。原来的一个aof文件会分割为一个base文件(最多一个)和incremental文件(增量文件,可能有多个)。base文件代表重写时的最初的数据集快照,增量文件保存了base文件创建之后追加的指令。这些文件分布在不同的目录下并且被manifest文件追踪。
日志重写
随着写操作的增加,aof文件会越来越大。比如我们执行了100次的自增操作,那么redis中只有一个key,但是aof中有100条指令。其中99条都是无用的。
重写过程是绝对安全的。在重写时redis会持续写入旧文件,并根据当前数据集创建一个最小指令的新文件。一旦新文件准备就绪,redis就会切换两个文件,并在开始在新文件后追加指令。
所以redis提供一个有趣的特性:它能够在后台重写AOF而不中断对客户端的服务。当你执行bgrewriteaof命令时,redis会根据当前数据集创建一个最小化的aof文件。如果你使用的是2.2版本,那么你需要时不时的调用bgrewriteaof。从2.4开始redis会自动重写aof。
从7.0版本开始,当AOF重写被调度的时候,父进程会开启一个增量文件并将接下来的指令写入进去,子进程会执行重写逻辑并生成一个新的base文件。redis会用临时的manifest文件来追踪新创建的base和增量文件。当这些文件准备好的时候,redis会执行一个原子性的替换操作来让临时manifest文件生效。为了避免在AOF重写重复失败和重试时创建许多增量文件的问题,Redis引入了AOF重写限制机制,以确保以越来越慢的速度重试失败的AOF重写。
AOF的持久性
你可以设置fsync的策略,有3种模式:
- always:每次新指令追加到aof文件时都执行fsync。这种模式很慢也很安全。在从多个客户端或pipeline接收到一系列指令之后,这写指令会追加到aof种,这意味着只有一次写入和同步(在同步给副本之前)
- everysecond:每秒同步一次。足够快(在2.4版本之后可以与快照一样快),你可能最多会丢失1秒的数据
- no:从不fsync,数据都交给操作系统处理。最快且最不安全的模式。正常情况下linux会30秒同步一次,取决于内核
推荐的和默认的模式是每秒同步。速度和安全性都有保障。always策略在实践表现很慢,但是支持分组提交,redis会执行单次fsync。
如果AOF被truncate怎么办
这可能发生在重写时redis崩溃,或者重写时aof文件所在的磁盘满了。当这种情况发生时,AOF仍然包含表示数据集的给定时间点版本的一致数据(使用默认AOF fsync策略,该数据集可能早到一秒),但AOF中的最后一个命令可能会被截断。Redis的最新主要版本无论如何都可以加载AOF,只需丢弃文件中最后一个格式不正确的命令即可。在这种情况下,服务器将发出如下日志:
* Reading RDB preamble from AOF file...
* Reading the remaining AOF tail...
# !!! Warning: short read while loading the AOF file !!!
# !!! Truncating the AOF at offset 439 !!!
# AOF loaded anyway because aof-load-truncated is enabled
如果AOF文件被破坏了怎么办
如果aof文件的字节序列在中间发生错误,情况会比truncate更复杂。redis会在启动时报出:
* Reading the remaining AOF tail...
# Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>
最好的办法是运行redis-check-aof,不使用–fix选项。然后分析问题,找到给出的文件offset处,并查看是否可以手动修复aof文件:aof文件使用和redis一样的协议,很容易理解和修复。否则可以让工具为我们修复,但是这可能丢失从错误开始到文件结尾的部分,如果错误发生在很靠前的位置,可能丢失大量的数据。
实现原理
aof重写和快照一样使用了写时复制技术:
7.0版本后
- fork创建子进程
- 子进程开始写入新的base文件到一个临时文件中
- 父进程打开一个新的增量文件并将接下来的指令写入。如果重写失败,则旧base+旧增量+新增量文件代表全部的数据,因此是安全的。
- 如果子进程重写完成,父进程会接收到一个信号,使用新打开的增量文件和子进程创建的base文件来构建一个临时的manifest文件并持久化。
- redis对manifest文件做一个原子性的替换操作,新的aof文件生效。redis也会清理旧的base文件和用不到的增量文件。
7.0版本前
- fork子进程
- 子进程开始重写新的aof文件到临时文件
- 父进程将接收到的指令写入内存缓冲区和旧的aof文件中,如果重写失败的话数据也是安全的。
- 当子进程重写完成,父进程收到一个信号,将缓冲区中的数据同步到新创建的aof文件中。
- redis原子性的将新文件重命名为旧文件,并开始向新文件中追加指令。
如果我正在使用RDB快照,如何切换到AOF
这个问题在2.2之前和之后的版本不一样,可以理解为2.2版本之后更简单且完全不需要重启。
2.2版本后
- 创建一个dump.rdb文件的备份
- 把这个备份保存到安全的地方
- 执行下面的命令
- redis-cli config set appendonly yes
- redis-cli config set save “”
- 确保数据库中的key数量和aof中的key数量相同
- 确保新的指令正确的追加到aof文件中
第一条命令打开aof
第二条命令关闭快照持久化,这个命令的是可选的,如果你希望使用两种策略的话。
PS:不要忘记修改配置文件,否则重启之后上面的配置会失效并依然使用旧的配置文件中的配置。
2.0版本
- 创建一个dump.rdb文件的备份
- 把这个备份保存到安全的地方
- 停止服务的所有写入指令
- 执行redis-cli BGREWRITEAOF,这回创建aof文件
- 生成完aof文件后停止redis服务
- 编辑redis.conf文件开启aof
- 重启服务
- 确保包含的key和修改前的一致
- 确保新的指令正确的追加到aof文件中
RDB和APOF的影响
redis以后的版本会避免rdb执行期间触发aof重写,或者在aof重写时使用bgsave保存rdb。这可以避免redis的后台进程执行过重的磁盘I/O。
当后台正在执行rbd快照保存,用户明确使用bgrewriteaof指令时,服务会返回ok告诉用户重写操作已加入调度,一旦rdb完成就会立刻执行aof。
如果AOF和RDB都打开了,redis重启时会使用aof来重新构建数据,因为aof能保证数据更完整。
备份redis数据
redis的备份功能很友好,因为redis运行时可以复制rdb文件:rdb一旦创建就不会再更改,新的rdb会保存再临时文件里,新的文件准备就绪时就会原子性的重命名为旧的文件名。
这意味这redis运行时复制rdb文件是安全的,我们建议:
- 创建一个定时任务,每小时都保存一个rdb快照到一个目录下,然后每天保存一个rdb快照到另一个目录下。
- 每次定时脚本运行时,确保调用find命令来保证过旧的rdb文件被删除:例如你可以48小时内每小时都保存快照,且1-2个月内每天都保存快照。确保用日期和时间来命名快照。
- 每天至少将RDB快照转移一次,至少不能在redis运行的物理机中。
备份aof
如果你的redis只使用了aof,也可以备份。7.0开始,aof分为多个文件,这些文件保存在appenddirname配置的目录下。通常情况下你需要做的就是复制或者打包这些文件作为备份。使用这种方式备份要确保备份时关闭aof重写:
- 关闭aof重写命令:
CONFIG SET auto-aof-rewrite-percentage 0
确保不会手动调用aof重写(bgrewriteaof) - 检查是否正在重写
INFO persistence
并且确定aof_rewrite_in_progress
为0,如果为1意味着正在重写,需要等一会 - 现在可以安全的复制目录下的文件
- 重新打开aof
CONFIG SET auto-aof-rewrite-percentage <prev-value>
原文档:redis持久化
相关文章:

【redis】持久化:RDB和AOF
redis的持久化指将数据写入可靠内存中,如ssd。Redis提供了4种持久化策略 RDB:Redis Database,周期性的将某个时间点的数据集快照持久化AOF:Append Only File,每次redis服务接收到写操作(修改内存的操作),都…...

2023Python接口自动化测试实战教程,附视频实战讲解
这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下。 一、整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类,比如数据库sql…...

【原创】java+swing+sqlserver药品管理系统设计与实现
之前数据库都是用的mysql,今天我们使用sqlserver在配合swing来开发一个药品管理系统。方便医院工作人员进行药品的管理,基础功能基本都是一些增删改查操作。 功能分析: 药品管理系统主要提供给管理员和员工使用,功能如下&#x…...

软考高级信息系统项目管理师系列之二十七:信息文档管理与配置管理
软考高级信息系统项目管理师系列之二十七:信息文档管理与配置管理 一、信息文档管理与配置管理内容整理二、信息系统文档管理1.信息系统文档概念2.软件文档分类与质量等级三、配置管理1.配置管理2.典型配置项3.配置项4.配置项操作权限5.配置项状态6.配置项版本号7.配置项版本管…...

软考高级-信息系统管理师之项目管理基础(最新版)
项目管理基础 项目管理特点战略管理三个过程IT项目特点项目管理概念项目管理特点软技能PRINCE2的四个要素组织结构职能型组织优缺点职能型组织优点同时,职能型组织也存在着如下缺点:项目型组织优缺点项目型组织优点项目型组织也存在着如下缺点:矩阵型组织优缺点矩阵型组织的优…...

leetcode240+Search a 2D Matrix II+从右上角开始
链接 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if(matrix.size()0 || matrix[0].size()0) return false;int i0, jmatrix[0].size()-1; //从右上角开始while (i<matrix.size()&&j>0) {int x mat…...

0xL4ugh 2023
这回跟着个队伍跑,不过还是2X以后的成绩,前边太卷了。自己会的部分,有些是别人已经提交了的。记录一下。Cryptocrypto 1给了一些数据,像这样就没有别的了ct [0, 1, 1, 2, 5, 10, 20, 40, 79, 159, 317, 635, 1269, 2538, 5077, 1…...

Mybatis(4)之跟着老杜做一个简单的银行转账会话
这是个MVC项目,我不一定可以完整的实现这个项目,但力求把这个复现出来,尽量的复现细节。 第一步:创建数据库 表 创建表如下: 我们使用 int 是为了方便 然后采用 demcial,精确度较高 添加两个用户 然后…...

VBA提高篇_ 22 事件处理
文章目录1.事件编程2.常用工作簿事件名称与对应处理过程名称示例3. 事件编程的步骤4.工作簿事件4.1 Open4.2 BeforeClose4.3 NewSheet5.工作表事件6.变量和过程函数的作用域1.事件编程 写在事件发生地(对应工作簿或工作表) 2.常用工作簿事…...

【蓝桥杯集训·周赛】AcWing 第91场周赛
文章目录第一题 AcWing 4861. 构造数列一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4862. 浇花一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4861. 构造数列一、题目1、原题…...

【人工智能AI】三、NoSQL 实战《NoSQL 企业级基础入门与进阶实战》
帮我写一篇介绍NoSQL的技术文章,文章标题是《NoSQL 实战》,不少于3000字。这篇文章的目录是 3.NoSQL 实战 3.1 MongoDB 入门 3.1.1 MongoDB 基本概念 3.1.2 MongoDB 安装与配置 3.1.3 MongoDB 数据库操作 3.2 Redis 入门 3.2.1 Redis 基本概念 3.2.2 Red…...

platform 总线
驱动的分离与分层思想 分离:硬件信息分离; 在编写硬件驱动的时候,需要操作许多硬件寄存器。比如gpio 驱动,你需要知道gpio控制器 寄存器的地址,你想要哪个gpio输出?或是输入? 这些操作最终都是靠设置寄存…...

2023第10届生物发酵展3月30-4月1号山东济南开展,参观路线来了
2023第10届生物发酵展3月30-4月1号山东济南开展,参观路线来了!展会时间:2023年3月30日-4月1日展馆地址:山东国际会展中心(济南市槐荫区日照路1号)展馆:4号馆、5号馆BIO CHINA生物发酵展…...

RK356x U-Boot研究所(命令篇)3.6 fdt命令的用法
平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3文章目录 一、fdt命令的配置二、fdt命令的定义三、fdt命令的用法3.1 fdt list3.2 fdt rm3.3 fdt set一、fdt命令的配置 .config配置文件需要有以下配置: rk3568_defconfig默认已使能。 二、fdt命令的定义 usb命令定义在cm…...

2023年社工工资多少钱一月 能领多少补贴
2023年社会工作者人员的待遇还算可以,每月的全额工资一共5000多,扣完五险一金以后每月的到手工资一共4000多,不同地区薪资也是不同的,一线城市会在7千元以上,还可以领取几百到几千元不等的补贴。 12023年社工工资多少钱…...

面试攻略,Java 基础面试 100 问(十一)
抽象类(abstract class)和接口(interface)有什么异同? 抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现ÿ…...

接口测试(Fiddler工具)
目录 1.Fiddler是什么? 2.Fiddler的原理 3.Fiddler安装 4.Fiddler界面 4.1.常用工具 4.2 会话列表 4.3 状态栏 4.4 内容显示区 1.Fiddler是什么? Fiddler是客户端与服务器之间的HTTP代理,是当前最常用的HTTP协议抓包工具。 主要功能&a…...

Debian/Ubuntu 安装和使用 perf 调试工具
为操作系统安装基本依赖环境:apt-get update -y apt-get upgrade -y apt-get install lrzsz zip unzip libkrb5-dev libicu-dev screen iftop openssl libssl-dev libunwind8 iftop net-tools gcc gdb cmake curl wget -y apt-get install gcc gdb cmake python-dev…...

【Python语言基础】——Python NumPy 数组连接
Python语言基础——Python NumPy 数组连接 文章目录 Python语言基础——Python NumPy 数组连接一、Python NumPy 数组连接一、Python NumPy 数组连接 连接 NumPy 数组 连接意味着将两个或多个数组的内容放在单个数组中。 在 SQL 中,我们基于键来连接表,而在 NumPy 中,我们按…...

解决IDEA报错:无效的目标发行版: 17
解决IDEA报错:无效的目标发行版: 17 目录解决IDEA报错:无效的目标发行版: 17报错由来解决报错【1】检查setting设置,查看编译器编译模块的编译版本是否是你需要的【2】尝试去修改当前项目的启动设置,设置JRE为你需要的版本。【3】…...

Redis第四讲
目录 四、Redis04 4.1 Redis集群应用场景 4.2 集群 4.2.1 基本原理 4.2.2 主从复制的作用 4.3 配置集群(一台虚拟机) 4.3.1 规划网络 4.3.2 创建节点 4.3.3 创建目录 4.3.4 配置redis7001.conf 4.3.5 配置其余文件 4.3.6 后台启动redis 4.3…...

Linux Ubuntu 软件安装与卸载
文章目录1 下载 deb 安装包后安装2 清理安装包3 卸载安装2 Ubuntu升级某个软件参考:1 下载 deb 安装包后安装 进入下载位置,执行 terminal sudo dpkg -i *.deb推荐sudo apt install *.deb 2 清理安装包 sudo apt-get install 会将下载的文件放在 /var…...

metasploit穷举模块
目录 工具介绍 常用模块 参数介绍 工具使用 工具介绍 Metasploit框架(Metasploit Framework, MSF)是一个开源工具, 旨在方便渗透测试,它是由Ruby程序语言编写的模板化框架,具有很好的扩展性,便于渗透测试人员开发、使用定制的…...

day35 贪心算法 | 435、无重叠区间 763、划分字母区间 56、合并区间
题目 435、无重叠区间 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], […...

C++Primer15.5节练习
练习15.18: Base* p &d1:合法 p &d2:不合法,只有当派生类公有地继承基类时,用户代码才能使用派生类向基类的转换 p &d3:不合法,只有当派生类公有地继承基类时࿰…...

【日常点滴019】Python制作流浪气球游戏(导弹射击类)
Python制作流浪气球游戏(导弹射击类)教学课程代码(分步教学版)1、构建全局通用代码结构2、构建气球精灵类3、构建导弹精灵类4、碰撞检测5、构建游戏信息类 (最终完整代码)教学课程代码(分步教学…...

effective c++阅读之旅---条款29
为"异常安全"而努力是值得的! 什么是异常安全? 所谓的"异常安全",往往值得是函数接口的异常安全,它要求函数满足两个条件: 异常抛出时: 1、不泄露任何资源 2、不允许数据被破坏 异常安…...

Android system — 进程生命周期与ADJ
Android system — 进程oom_adj0. 引言1. 进程的生命周期1.1 Foreground process1.2 Visible process1.3 Service process1.4 Background process1.5 Empty process2. Lowmemorykiller2.1 ADJ级别2.2 进程state级别2.3 lmk策略2.4 如何查看应用oom_adj值3. 注意0. 引言 本文主要…...

vue3+ts+node个人博客系统(三)
一.主页顶部和中心面板布局 (1) 首先先去element-plus选择合适的布局el-container (2)在头部处编写相应的菜单栏el-menu,在这里要注意动态绑定路由的问题:default-active"$route.path"。将default-active设置为$route.path,el-me…...

Python第三方模块
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放࿰…...