【day5】Redis持久化之AOF + Redis事务_锁机制

news2025/1/15 16:53:33

AOF是什么

以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(比 如 set/del 操作会记录, 读操作 get 不记录

 只许追加文件但不可以改写文件

 redis 启动之初会读取该文件重新构建数据

 redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

 aof文件存储位置跟rbd文件存储设置的位置一致

 持久化流程

1) 客户端的请求写命令会被 append 追加到 AOF 缓冲区内

2) AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作 sync 同步到磁盘的 AOF 文件 中

3) AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容 量

4) Redis 服务重启时,会重新 load 加载 AOF 文件中的写操作达到数据恢复的

开启AOF

 在 redis.conf 中配置文件名称,默认为 appendonly.aof

AOF 启动/修复/恢复

正常恢复 

 跟rdb文件备份恢复一样 都是先拷贝一份文件 在进行恢复

异常恢复

1、如遇到 AOF 文件损坏,通过/usr/local/bin/redis-check-aof --fix appendonly.aof 进行恢复 2、建议先: 备份被写坏的 AOF 文件

3、恢复:重启 redis,然后重新加

 同步频率设置

 

1) appendfsync always 谨慎使用
始终同步,每次 Redis 的写入都会立刻记入日志;性能较差但数据完整性比较好

2) appendfsync everysec 默认 每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。

3) appendfsync no redis 不推荐 不主动进行同步,把同步时机交给操作系统

Rewrite 压缩 

 1、rewrite 重写介绍

1) AOF 文件越来越大,需要定期对 AOF 文件进行重写达到压缩

2) 旧的 AOF 文件含有无效命令会被忽略,保留最新的数据命令 , 比如 set a a1 ; set a b1 ; set a c1; 保留最后一条指令就可以了

3) 多条写命令可以合并为一个 , 比如 set a c1 b b1 c c1

4) AOF 重写降低了文件占用空间

5) 更小的 AOF 文件可以更快的被 redis 加载

 重写触发配置

 1) 手动触发 直接调用 bgrewriteaof 命令

2) 自动触发

auto-aof-rewrite-min-size: AOF 文件最小重写大小, 只有当 AOF 文件大小大于该值时候才能 重写, 默认配置 64MB

auto-aof-rewrite-percentage: 当前 AOF 文件大小和最后一次重写后的大小之间的比率等于 或者大于指定的增长百分比,如 100 代表当前 AOF 文件是上次重写的两倍时候才重写

系统载入时或者上次重写完毕时,Redis 会记录此时 AOF 大小,设为 base_size,

如果 Redis 的 AOF 当前大小>= base_size +base_size*100% (默认)且当前 大小>=64mb(默认)的情况下,Redis 会对 AOF 进行重写

 AOF 持久化

优势

1、备份机制更稳健,丢失数据概率更低。

2、可读的日志文本,通过操作 AOF 稳健,可以处理误操作

劣势

1、比起 RDB 占用更多的磁盘空间

2、恢复备份速度要慢

3、每次读写都同步的话,有一定的性能压力

 RDB 还是 AOF?

官方推荐两个都启用


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

 Redis_事务_锁机制

 Redis 的事务是什么

1、Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行

2、事务在执行的过程中,不会被其他客户端发送来的命令请求所打断

3、Redis 事务的主要作用就是串联多个命令防止别的命令插队

 Redis 事务三特性

 单独的隔离操作

1、事务中的所有命令都会序列化、按顺序地执行

2、事务在执行的过程中,不会被其他客户端发送来的命令请求所打断

 没有隔离级别的概念

 队列中的命令(指令), 在没有提交前都不会实际被执行

 不保证原子性

 事务执行过程中, 如果有指令执行失败,其它的指令仍然会被执行, 没有回滚

事务相关指令 Multi(开启事务队列)、Exec(执行)、discard(丢弃/放弃此次组队)

1) 从输入 Multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行(类似 Mysql 的 start transaction 开启事务)

2) 输入 Exec 后,Redis 会将之前的命令队列中的命令依次执行(类似 Mysql 的 commit 提 交事务)

3) 组队的过程中可以通过 discard 来放弃组队(类似 Mysql 的 rollback )

 悲观锁&乐观锁

icon-default.png?t=O83Ahttps://hlz666.blog.csdn.net/article/details/129978116?fromshare=blogdetail&sharetype=blogdetail&sharerId=129978116&sharerefer=PC&sharesource=weixin_60205306&sharefrom=from_link

1) 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修 改,所以每次在拿数据的时候都会上锁

2) 这样别人/其它请求想拿这个数据就会 block 直到它拿到锁。

3) 悲观锁是锁设计理念, 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁, 表锁等,读锁,写锁等,都是在做操作之前先上锁.

 1) 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会 修改,所以不会上锁

2) 但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等 机制。

3) 乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis 就是利用这种 check-and-set 机制实现事务的

 watch & unwatch

 watch

1、基本语法: watch key [key ...]

2、在执行 multi 之前,先执行 watch key1 [key2],可以监视一个(或多个) key ,如果在 事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断.

 unwatch

1、基本语法 unwatch

2、取消 watch 命令对所有 key 的监视。

3、如果在执行 watch 命令后,exec 命令或 discard 命令先被执行了的话,那么就不 需要再执行 unwatch 了

 

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

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

相关文章

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

文章目录 一、什么是Locust二、Locust 架构组成三、实战 Demo准备一个可调用的接口编写一个接口测试用例编写一个性能测试用例执行性能测试用例代码1、通过 Web UI 执行(GUI模式)2、通过命令行执行(非GUI模式) 小知识:…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注: Jaeger服务端版本为:jaegertracing/all-in-one-1.6.0 OpenTracing版本为:0.33.0,最后一个版本,停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为:jaeger-client-1.3.2。…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO(El Nio-Southern Oscillation)是全球气候系统中最显著的年际变率现象之一,对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来,深度学习技术在气象领域…

【IDEA 2024】学习笔记--文件选项卡

在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…

nginx的可视化配置工具nginxWebUI的使用

文章目录 1、nginx简介2、nginxWebUI2.1、技术解读2.2、开源版和专业版之间的区别2.3、功能解读 3、安装与使用3.1、下载镜像3.2、查看镜像3.3、启动容器3.4、使用 4、总结 1、nginx简介 Nginx 是一个高效的 HTTP 服务器和反向代理,它擅长处理静态资源、负载均衡和…

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行,这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟,但很多特性还得qt6才行,这里用qt5.14.2主要是考虑到服…

系统思考—全局思维

在一个复杂的企业中,无论是生产、营销、研发、产品还是采购,作为核心团队,大家不只关注单一的问题——需要从整体出发。企业是一个有机的整体,每一个环节都息息相关。如果只解决一个问题,却忽视了其他部分的相互作用&a…

软件设计师 - 第10章 网络与信息安全基础知识

网络概述 功能:数据通信,资源共享,管理集中化,实现分布式处理,负载均衡 分类:局域网,城域网,广域网 拓扑结构:总线型,星型,环型,树型,分布式 ISO/OSI七层模型: 应用层:提供与用户交互的界面,并支持特定应用程序的服务,FTP、Telnet、SMTP、NFS、SNMP、HTTP、…

记录一次Android Studio的下载、安装、配置

目录 一、下载和安装 Android Studio 1、搜索下载Android studio ​2、下载成功后点击安装包进行安装: 3、这里不用打勾,直接点击安装 : 4、完成安装: 5、这里点击Cancel就可以了 6、接下来 7、点击自定义安装&#xff1a…

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路 文章目录 1.前言2.思路2.1使用ELK收集日志2.1.1ELK搭建2.1.2项目中集成ELK日志收集2.1.2.1 引入依赖2.1.2.2 logback-xxx.xml配置2.1.2.3 yaml配置 2.2本文思路2.2.1书接上文--自…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量,路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了!

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们,技术图文创作很不容易…

相机SD卡照片数据不小心全部删除了怎么办?有什么方法恢复吗?

前几天,小编在后台友收到网友反馈说他在整理相机里的SD卡,原本是想把那些记录着美好瞬间的照片导出来慢慢欣赏。结果手一抖,不小心点了“删除所有照片”,等他反应过来,屏幕上已经显示“删除成功”。那一刻,…

《C++11》nullptr介绍:从NULL说起

在C11之前,我们通常使用NULL来表示空指针。然而,NULL在C中有一些问题和限制,这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中,NULL实际上是一个整数0,而不是一个真正的…

【搭建JavaEE】(2)Tomcat安装配置和第一个JavaEE程序

Tomcat–容器(Container) 下载 Apache Tomcat - Welcome! 下载完成 请求/响应 结构 测试 查看Jdk版本 改端口号localhost8080–>8099 学学人家以后牛逼了可以用自己名字当文件夹名 配置端口8099 找到server文件 用记事本打开 再打开另一个logging文件 ”乱码解决“步骤&…

​​​​​​​​​​​​​​★3.3 事件处理

★3.3.1 ※MouseArea Item <-- MouseArea 属性 acceptedButtons : Qt::MouseButtons containsMouse : bool 【书】只读属性。表明当前鼠标光标是否在MouseArea上&#xff0c;默认只有鼠标的一个按钮处于按下状态时才可以被检测到。 containsPress : bool curs…

【C】初阶数据结构3 -- 单链表

之前在顺序表那一篇文章中&#xff0c;提到顺序表具有的缺点&#xff0c;比如头插&#xff0c;头删时间复杂度为O(n)&#xff0c;realloc增容有消耗等。而在链表中&#xff0c;这些问题将得到解决。所以在这一篇文章里&#xff0c;我们将会讲解链表的定义与性质&#xff0c;以及…

Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)

一、函数基础 1.1、函数的用法和底层分析 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;更能实现代码的一致性。一致性指的是&#xff0c;只要修改函数的代码&#xff0c;则所有调用该函数的地方都能得到体现。 在编写函数时&#xf…

《leetcode-runner》如何手搓一个debug调试器——架构

本文主要聚焦leetcode-runner对于debug功能的整体设计&#xff0c;并讲述设计原因以及存在的难点 设计引入 让我们来思考一下&#xff0c;一个最简单的调试器需要哪些内容 首先&#xff0c;它能够接受用户的输入 其次&#xff0c;它能够读懂用户想让调试器干嘛&#xff0c;…

食堂采购系统源码:基于PHP的校园食堂供应链管理平台开发全解析

传统的食堂采购管理普遍存在信息不透明、流程繁琐、效率低下等问题&#xff0c;这使得开发一款高效、智能的食堂采购系统变得尤为重要。本篇文章&#xff0c;笔者将详细解析基于PHP开发的校园食堂供应链管理平台&#xff0c;从功能设计、系统架构到技术实现&#xff0c;全方位剖…