【技术栈】Redis 中的事务及持久化方式

SueWakeup

                                                      个人主页: SueWakeup

                                                      系列专栏:学习技术栈

                                                      个性签名:保留赤子之心也许是种幸运吧

本文封面由 凯楠📸 友情提供

目录

 相关传送门

1. Redis 中的事务 

 2. Redis 持久化

2.1 RDB 方式

2.1.1 RDB手动

2.1.2 RDB自动

2.2 AOF方式

2.2.1 AOF执行过程

2.2.2 AOF写数据的策略

2.2.3 AOF相关配置

2.2.4 AOF写数据遇到的问题

2.2.5 AOF重写

2.2.6 AOF重写规则

2.2.7 AOF重写方式

2.2.8 RDB 和 AOF 的区别

 注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转   


 本栏传送门

1.【技术栈】Redis 的理解与数据存储格式

2.【技术栈】Redis 中的事务及持久化方式

3.【技术栈】Redis 删除策略

4.【技术栈】Redis 企业级解决方案

5.【数据结构】布隆过滤器

6.【开发】SpringBoot 整合 Redis

7.【技术栈】Spring Cache 简化 Redis 缓存使用


1. Redis 中的事务 

概念:Redis事务中的所有命令都会序列化、按顺序的执行。

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

主要作用:串联多个命令防止别的命令插队

特点:

  1. Redis事务没有隔离级别的概念
  2. 所有的命令在事务中,没有被直接执行,只有发起执行命令的时候才会执行
  3. Redis单条命令保存原子性,但是事务不保证原子性

常用命令:

  1. multi:标记一个事务的开始
  2. exec:执行所有事务块内的命令
  3. discard:取消事务,放弃执行事务块内的所有命令
  4. watch key:监视一个或多个key,如果在事务执行之前这些key被其他命令所改动,那么事务将被打断。
  5. unwatch:取消watch命令对所有key的监视

为什么添加事务?

  • 悲观锁:每次在拿取数据的时候都会上锁,其他请求想获取这个数据就会block直到它拿到锁。传统的关系型数据库里就用到了很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁
  • 乐观锁: 每次在拿取数据的时候不会上锁,但是在更新的时候会判断一下在此期间别人有没有更新数据;适用于多读的应用类型,可以提高吞吐量。Redis 就是利用这种 check-and-set 机制实现事务的。

 2. Redis 持久化

Redis是内存数据库,一旦服务器进程退出,服务器中的数据库状态也会消失,所以需要Redis持久化

持久化过程:

  • RDB:将当前数据状态进行保存,快照形式存储数据结果,存储格式简单,关注点在数据
  • AOF:将数据的操作过程进行保存,日志形式存储操作过程,关注点在数据库的操作过程

2.1 RDB 方式

2.1.1 RDB手动

命令:save

作用:手动执行一次保存操作

配置:

  • dbfilename dump.rdb

说明:设置本地数据库文件名,默认值为dump.rdb

经验:通常设置为 dump-端口号.rdb

  • dir

说明:设置存储.rdb文件的路径

经验:通常设置成存储空间较大的没目录中,目录名称为data

  • rdbcompression yes

说明:设置存储至本地数据库时是否压缩数据,默认为yes,采用LZF算法压缩

经验:通常默认为开启状态,如果设置为no,可以节省cpu运行时间,但会使存储的空间变大

  • rdbchecksum yes

说明:设置是否进行CRC64算法RDB文件格式校验,该校验过程在写文件和读文件过程均进行

经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存在一定的数据损害风险

save指令工作原理(单线程任务执行序列)

客户端1 127.0.0.1:6379>set key1 value1

客户端2 127.0.0.1:6379>set key2 value2

客户端3 127.0.0.1:6379>save

客户端4 127.0.0.1:6379>get key

对redis数据库执行4此指令顺序===> set set save get

注意:save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻 塞,线上环境不建议使用

  • bgsave指令

命令 :bgsave

作用 :手动启动后台保存操作,但不是立即执行

注意: bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方 式,save命令可以放弃使用

  • fork

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

2.1.2 RDB自动

配置 :save second changes

作用 : 满足限定时间范围内key的变化数量达到指定数量即进行持久化

参数 :

second:监控时间范围

changes:监控key的变化量

位置 : 在conf文件中进行配置

注意:

  • save配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的
  • save配置中对于second与changes设置通常具有互补对应关系,尽量不要设置成包含性关系
  • save配置启动后执行的是bgsave操作

优点:

  1. 紧凑压缩的二进制文件,存储效率高,节省磁盘空间,恢复数据速度比AOF快
  2. 内部存储redis在某个时间点的数据快照,适合用于数据备份

缺点:

  1. Redis在fork时使用了写时拷贝技术,内存中的数据被克隆了一份,数据庞大会消耗性能
  2. 无法做到实时持久化,较大的可能丢失数据
  3. 版本不统一,不同版本之间存在兼容问题

2.2 AOF方式

概念: 以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的;

主要作用:解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

2.2.1 AOF执行过程

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

AOF缓冲区根据AOF持久化策略将操作同步到磁盘的AOF文件

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

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

2.2.2 AOF写数据的策略

  • always每次:每次写入操作均同步到AOF文件中,数据零误差,性能较低

  • everysec每秒:每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高

    在系统突然宕机的情况下丢失1秒内的数据

  • no系统控制:由操作系统控制每次同步到AOF文件的周期,过程不可控

2.2.3 AOF相关配置

配置 :appendonly yes|no

作用 :是否开启AOF持久化功能,默认为不开启状态

配置 :appendfsync always|everysec|no

作用 :AOF写数据策略

配置:appendfilename filename

作用:AOF持久化文件名,默认文件名未appendonly.aof,建议配置为appendonly-端口号.aof

配置:dir

作用 :AOF持久化文件保存路径,与RDB持久化文件保持一致即可

2.2.4 AOF写数据遇到的问题

2.2.5 AOF重写

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。

将对同一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录

作用:

  • 降低磁盘占用量,降低持久化写时间,降低数据恢复用时
  • 提高磁盘利用率,提高持久化效率,提高IO性能,提高数据恢复效率

2.2.6 AOF重写规则

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

忽略无效指令,重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令

对同一数据的多条写命令合并为一条命令

为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元 素

AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)

2.2.7 AOF重写方式

手动重写 bgrewriteaof

自动重写

触发机制:何时重写 Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发;重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担 的,因此设定Redis要满足一定条件才会进行重写

auto-aof-rewrite-min-size 设置重写的基准值,最小文件64MB。达到这个值开始重写。

auto-aof-rewrite-percentage 设置重写的基准值,文件达到100%时开始重写(文件是原 来 重写后文件的2倍时触发

2.2.8 RDB 和 AOF 的区别

持久化方式RDBAOF

占用存储空间

小(数据级:压缩)

大(指令级:重写)

存储速度

快 

恢复速度

数据安全性

会丢失数据依据策略决定

资源消耗

重量级轻量级

启动优先级

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode:2684. 矩阵中移动的最大次数(DP Java)

目录 2684. 矩阵中移动的最大次数 题目描述: 实现代码与解析: DP 原理思路: 2684. 矩阵中移动的最大次数 题目描述: 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid ,矩阵由若干 正 整数组成。 你可以从矩阵第…

C++第八弹---类与对象(五)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、运算符重载 1.1、赋值运算符重载 1.2、前置和后置重载 2、const成员 3、取地址及const取地址操作符重载 总结 1、运算符重载 1.1、赋值运…

MathType注册码永久激活版2024中文版

1、 点击exe的安装包,然后像普通软件一样安装即可,路径选择你可以找到的(后面设置会用到) 2、安装完成之后,不要打开!不要打开!不要打开!这一步很重要!!!安装之后,打开激活工具(激活工具&#x…

Spring之@Autowired注解

Autowired的几种用法 作用在属性上作用在方法上作用在构造器上 demo演示 创建三个普通bean Component public class ComponentA { }Component public class ComponentB { }Component public class ComponentC { } 依赖注入 package com.test.model.component;import org.…

Spring学习记录之依赖注入

问题1: 往一个类中传递数据的方式有哪些呢,其实,只有一种方式,即通过方法,但方法却有多种,一种是我们先前学到的通过set方法(普通方法),另一种则是通过构造方法的方式。…

3.19作业

1、思维导图 2、模拟面试题 1)TCP通信中的三次握手和四次挥手 答:三次握手 客户端向服务器发送连接请求 服务器向客户端回复应答并向客户端发送连接请求 客户端回复服务端,并建立联系 四次挥手 进程a向进程b发送断开连接请求…

单例设计模式,各种排序复习

1.单例设计模式 资料来源 1.1单例模式是什么? 单例模式,属于创建类型的一种常用的软件设计模式。 通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程…

qt Qt Remote Object(QtRO)实现进程间通信

简介 Qt Remote Object简称QtRO,这是Qt5.9以后官方推出来的新模块,专门用于进程间通信(IPC)。是基于Socket来封装的,兼容LPC和RPC。LPC即Local Process Communication,而RPC是指Remote Process Communicat…

瑞士百达资产管理有限公司拟增三大去中心化数字加密货币支付接口!

简介: 瑞士百达集团成立于1805年,欧洲第三大财富管理公司, 集团拥有约 5,300 名员工,其中包括 900 名投资经理。它在金融服务中心拥有 30 个办事处网络,包括在日内瓦、卢森堡、拿骚、香港和新加坡的注册银行,百达集团管理的资产总额达6380亿瑞士法郎(7670亿美元)。 瑞士百达资…

触手可及的社交:揭示Facebook如何让每个人都能参与其中

引言 在当今社会,Facebook已经成为了人们日常生活中不可或缺的一部分。无论是与朋友、家人保持联系,还是参与社群讨论、获取新闻信息,Facebook都提供了一个触手可及的社交平台。本文将探讨Facebook如何让每个人都能轻松参与其中,…

ClickHouse01-什么是ClickHouse

什么是ClickHouse? 关于发展历史存在的优势与劣势什么是它风靡的原因? 什么是ClickHouse? 官方给出的回答是,它是一个高性能、列式存储、基于SQL、供在线分析处理的数据库管理系统 当然这边不得不提到OLAP(Online Analytical Pr…

代码随想录day24(1)二叉树:最大二叉树(leetcode654)

题目要求: 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构…

【C++】AVL树的两单旋和两双旋

目录 1. 新节点插入较高左子树的左侧---左左:右单旋 代码 2. 新节点插入较高右子树的右侧---右右:左单旋 代码 3. 新节点插入较高左子树的右侧---左右:先左单旋再右单旋 ​编辑 代码 4. 新节点插入较高右子树的左侧---右左:先…

如何选择适合大功率直流电子负载

选择适合大功率直流电子负载时,需要考虑以下几个关键因素: 功率范围:首先,需要确定所需的最大功率范围。大功率直流电子负载通常有不同的功率等级,如1kW、2kW、5kW等。根据实际应用场景和需求,选择合适的功…

CTF题型 php反序列化进阶(1) php原生类 例题和总结

CTF题型 php反序列化进阶(1) php原生文件操作类 例题和总结 文章目录 CTF题型 php反序列化进阶(1) php原生文件操作类 例题和总结特征原理 我们可以通过PHP自身本来就有的类来进行文件操作扫描目录的三个类DirectoryIterator(支持glob://协议)FilesystemIterator(继…

基于springboot的stone音乐播放器的设计与实现

摘 要 随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,stone音乐播放器展现了其蓬勃生命力和广阔的前景。与此同时,…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

小火星露谷管理器 报错:“你似乎没有安装Edge的webview2”

错误 解决办法 你可以到这个地方下载安装webview2 https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/?formMT00IS

如何进行汇川PLCH1U-XP系列PLC远程监控?

在工业自动化的浪潮中,可编程逻辑控制器(PLC)作为控制系统的核心,其稳定性和可靠性对于生产流程的顺畅运行至关重要。汇川PLCH1U-XP系列以其高性能和广泛的应用场景,在工业控制领域占有一席之地。然而,对于…

华为机试真题练习汇总(81~90)

华为机试真题练习汇总(81~90) 华为机试真题练习汇总(81~90)HJ81 字符串字符匹配** HJ82 将真分数分解为埃及分数HJ83 二维数组操作HJ84 统计大写字母个数HJ85 最长回文子串HJ86 求最大连续bit数HJ87 密码强度等级* HJ88 扑克牌大小…