Redis核心机制(一)
目录
Redis的特性
1.速度快
2.以键值对方式进行存储
3.丰富的功能
4.客户端语言多
5.持久化
6.主从复制
7.高可用和分布式
Redis使用场景
Redis核心机制——持久化
RDB
bgsave执行流程
编辑
AOF
AOF重写流程
3.混合持久化(RDB+AOF)
Redis核心机制——事务
事务介绍(和MySQL对比)
事务操作
Redis的特性
1.速度快
Redis读写命令的速度非常快:
Redis的所有数据都是存储到内存中的。
Redis使用单线程,预防了多线程产生的竞争问题。
2.以键值对方式进行存储
Redis是基于<key,value>的形式进行存储数据的,Redis中的值不仅可以是字符串,还支持多种数据结构:字符串(string)、列表(list)、哈希(hash)、集合(set)、有序集合(zset)、位图(Bitmap)、GEO(地理信息位置)。
3.丰富的功能
提供了键过期功能,可以实现缓存
提供了发布订阅功能,可以实现消息队列
支持Lua脚本,可以利用Lua创造出新的Redis命令
提供了简单的事务,支持打包命令
提供了流水线功能,客户端命令批次到达Redis,减少网络的开销
4.客户端语言多
Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,并且由于Redis收到社区和各大公司的认可,支持Redis客户端语言也非常多,几乎涵盖了主流编程语言:C、C++、Java、Python等
5.持久化
Redis虽然将读写数据都是到内存中,一旦服务器关闭,数据都会丢失,Redis提供了RDB和AOF两种持久化机制,使用这两种机制就可以将内存的数据保存到硬盘中,保证了数据的可持久性。
6.主从复制
Redis提供了复制功能,实现了多个相同数据的Redis副本,复制是分布式Redis的基础。
7.高可用和分布式
Redis提供了哨兵模式,保障Redis节点故障发现和故障自动转移。也提供了Redis集群,真正的分布式实现,提供了高可用、读写和容量拓展。
Redis使用场景
1.缓存(验证码)
Redis提供了过键值过期时间的设置,提供了内存淘汰策略。
2.排行榜系统(积分排名)
Redis提供了列表和有序集合的结构
3.计数器应用(点赞,浏览量)
Redis天然提供了技术功能
Redis核心机制——持久化
RDB
RDB持久化就是将当前进程数据以生成快照保存到硬盘中,触发RDB分为自动触发和手动触发。
手动触发:使用save命令,此时会阻塞当前Redis服务器,直到RDB执行完毕,此时对内存影响较大,基本不采用这种方式去手动进行触发RDB操作。使用bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在创建子进程阶(fork),时间很短。
自动触发:Redis运行时会自动触发持久化机制。通过配置文件进行触发,通过修改配置文件中的save选项,save m n表示m秒内数据发生n次修改,自动进行RDB持久化。从节点进行全量复制操作时,主节点自动进行RDB持久化,随后将RDB文件内容发送给从节点。执行shoutdown命令关闭Redis时,执行RDB持久化。
bgsave执行流程
Redis执行bgsave命令,父进程判断是否存在其他正在执行的子进程,RDB/AOF子进程,如果存在bgsave命令直接返回。
父进程执行fork创建子进程,fork过程中父进程会阻塞。
创建子进程完成后bgsave会返回信息通知父进程不在阻塞,继续响应其他命令。
子进程创建RDB文件,根据父进程内存生成的临时快照文件对原有文件进行替换。
子进程发送信号给父进程表示完成,父进程更新统计信息。
优缺点:RDB是一个紧凑压缩的二进制文件,代表
AOF
AOF持久化以日志的形式将每次执行的命令记录下来,重启服务器时执行AOF文件的命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性。
AOF工作流程:

1.所有写入的命令会追加到aof_buf(缓冲区)中。
2.AOF缓冲区根据对应策略向硬盘做同步操作。
3.随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩目的。
4.当Redis服务器启动时,可以加载AOF文件进行数据恢复。
Redis使用单线程进行命令的响应,如果每次都将数据直接写入硬盘会使性能下降,此时可以先将数据写入缓冲区中,然后在一同写入硬盘中,有效减少IO次数,提高性能。
随着命令不断写入AOF文件,这个文件会越来越大,AOF文件会进行重写,压缩文件体积。即进程内已超时数据不会写入文件,重复,失败的命令不会写入文件,多条操作合并为一条。
AOF重写触发时机:手动触发,调用bgrewriteaof命令。自动触发:根据配置文件进行指定,如触发重写时AOF的最小文件大小,AOF占用大小相较于上次重写时增加的比例。
AOF重写流程

1.执行 AOF重写请求
如果当前请求正在执行AOF重写,请求不执行。如果当前进程正在执行bgsave操作,重写命令延迟到bgsave完成后执行。
2.父进程执行fork创建子进程。
3.重写
a.主进程fork之后,继续响应其他命令。所有修改操作都会写入AOF缓冲区,然后同步到硬盘
b.子进程只有执行fork之前的所有内存信息,父进程中需要将fork之后这段时间的修改操作写入AOF重写缓冲区中。
4.子进程根据内存快照,将命令合并到新的AOF文件中。
5.子进程重写完成。
a.新文件写入后,子进程发送信号给父进程。
b.父进程把AOF重写缓存区临时保存的命令追加到AOF文件中
c.用新的AOF文件代替老的AOF文件。
3.混合持久化(RDB+AOF)
结合RDB和AOF文件特点,使用RDB文件+AOF增量文件存放在一起,即RDB持久化时,执行的命令使用AOF进行记录。
Redis核心机制——事务
事务介绍(和MySQL对比)
Redis事务和MySQL的事务概念上类似,都是把一系列操作打包在一起,批量执行。
原子性
Redis不支持回滚操作,只能将操作打包进行批量执行。
一致性
不保证数据一致性,Redis不支持回滚操作,不能保证数据前后一致性。
隔离性
没有隔离级别,Redis是单线程模型,不会并发执行事务。
持久性
不需要持久性,数据保存在内存中,是否开启持久化,是Redis服务器的事情,和事务无关。
Redis事务本质是在服务器上内置了一个“事务队列”,客户端在事务中进行一个操作,会将这个命令发送给服务器,服务器放到“事务队列”中(但是并不会立即执行),收到EXEC命令后,才会真正执行队列中的所有操作。正因如此,Redis的事务相比于MySQL来说,是弱化很多的,,只能保证事务中的操作是“连续的”,不会被别的客户端”加塞“。
事务操作
MULTI:开启事务
EXEC:真正执行事务
DISCARD:放弃当前事务,此时直接清空事务队列,之前的操作都不会真正执行到。
WATCH:在执行事务的时候,如果某个事务中修改的值被别的客户端修改,此时就容易出现数据不一致的情况。watch在客户端上监控一组具体的key。
当开启事务时,如果对watch的key进行修改,就会记录当前key的“版本号”,在真正提交事务的时候,如果发现服务器上的key版本号已经超过了事务开始时的版本号,就会让事务执行失败。(事务中的所有操作都不执行)
UNWATCH:取消对key的监控,相当于watch的逆操作。
文章结束,感谢观看
相关文章:
Redis核心机制(一)
目录 Redis的特性 1.速度快 2.以键值对方式进行存储 3.丰富的功能 4.客户端语言多 5.持久化 6.主从复制 7.高可用和分布式 Redis使用场景 Redis核心机制——持久化 RDB bgsave执行流程 编辑 AOF AOF重写流程 3.混合持久化(RDBAOF) Red…...
QGroupBox取消勾选时不禁用子控件
默认情况下,QGroupBox取消勾选会自动禁用子控件,如下图所示 那么如何实现取消勾选时不禁用子控件呢? 实现很简单,直接上代码了 connect(ui->groupBox, &QGroupBox::toggled, this, [](bool checked){if (checked false){…...
Go语言中package的使用规则《二》
在 Go 语言中,包(Package) 是代码组织和复用的核心单元。以下是其定义、引用规则及使用习惯的详细说明: 一、包的定义规则 目录与包名 一个包对应一个目录(文件夹),目录名通常与包名一致。 包名…...
MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!
目录 一、什么是 MyBatis-Plus 自动填充? 🤔二、自动填充的原理 ⚙️三、实际例子:创建时间和更新时间字段自动填充 ⏰四、注意事项 ⚠️五、总结 🎉 🌟我的其他文章也讲解的比较有趣😁,如果喜欢…...
canvas数据标注功能简单实现:矩形、圆形
背景说明 基于UI同学的设计,在市面上找不到刚刚好的数据标注工具,遂决定自行开发。目前需求是实现图片的矩形、圆形标注,并获取标注的坐标信息,使用canvas可以比较方便的实现该功能。 主要功能 选中图形,进行拖动 使…...
Python 魔术方法深度解析:__getattr__ 与 __getattribute__
一、核心概念与差异解析 1. __getattr__ 的定位与特性 触发时机: 当访问对象中 **不存在的属性** 时自动触发,是 Python 属性访问链中的最后一道防线。 核心能力: 动态生成缺失属性实现优雅的错误处理构建链式调用接口(如 R…...
【机器学习】机器学习工程实战-第2章 项目开始前
上一章:第1章 概述 文章目录 2.1 机器学习项目的优先级排序2.1.1 机器学习的影响2.1.2 机器学习的成本 2.2 估计机器学习项目的复杂度2.2.1 未知因素2.2.2 简化问题2.2.3 非线性进展 2.3 确定机器学习项目的目标2.3.1 模型能做什么2.3.2 成功模型的属性 2.4 构建机…...
【UI设计】一些好用的免费图标素材网站
阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一,拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等,适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…...
Visual Studio(VS)的 Release 配置中生成程序数据库(PDB)文件
最近工作中的一个测试工具在测试多台设备上使用过程中闪退,存了dump,但因为是release版本,没有pdb,无法根据dump定位代码哪块出了问题,很苦恼,查了下怎么加pdb生成,记录一下。以下是具体的设置步…...
ubuntu 解挂载时提示 “umount: /home/xx/Applications/yy: target is busy.”
问题如题所示,我挂载一个squanfs文件系统到指定目录,当我使用完后,准备解挂载时,提示umount: /home/xx/Applications/yy: target is busy.,具体的如图所示, 这种提示通常是表明这个路径的内容正在被某些进…...
一条不太简单的TEX学习之路
目录 rule raisebox \includegraphics newenviro 、\vspace \stretch \setlength 解释: 总结: 、\linespread newcommand \par 小四 \small simple 、mutiput画网格 解释: 图案解释: xetex pdelatex etc index 报…...
Matplotlib完全指南:数据可视化从入门到实战
目录 引言 一、环境配置与基础概念 1.1 安装Matplotlib 1.2 导入惯例 1.3 两种绘图模式 二、基础图形绘制 2.1 折线图(Line Plot) 2.2 柱状图(Bar Chart) 三、高级图表类型 3.1 散点图(Scatter Plotÿ…...
在大数据开发中ETL是指什么?
hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代,数据已成为企业最核心的资产。然而,分散在业务系统、日志文件…...
OAuth 2.0认证
文章目录 1. 引言1.1 系列文章说明1.2 OAuth 2.0 的起源与演变1.3 应用场景概览 2. OAuth 2.0 核心概念2.1 角色划分2.2 核心术语解析 3. 四种授权模式详解3.1 授权码模式(Authorization Code Grant)3.1.1 完整流程解析3.1.2 PKCE 扩展(防止授…...
【Linux 下的 bash 无法正常解析, Windows 的 CRLF 换行符问题导致的】
文章目录 报错原因:解决办法:方法一:用 dos2unix 修复方法二:手动转换换行符方法三:VSCode 或其他编辑器手动改 总结 这个错误很常见,原因是你的 wait_for_gpu.sh 脚本 文件格式不对,具体来说…...
Kubernetes的Replica Set和ReplicaController有什么区别
ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理应用程序副本的两种资源,它们有类似的功能,但 ReplicaSet 是 ReplicationController 的增强版本。 以下是它们的主要区别: 1. 功能的演进 ReplicationController 是 Kubernete…...
WSL 导入完整系统包教程
作者: DWDROME 配置环境: OS: Ubuntu 20.04.6 LTS on Windows 11 x86_64Kernel: 5.15.167.4-microsoft-standard-WSL2ros-noetic 🧭WSL 导入完整系统包教程 ✅ 一、准备导出文件 假设你已有一个 .tar 的完整系统包(如从 WSL 或 L…...
[Lc_2 二叉树dfs] 布尔二叉树的值 | 根节点到叶节点数字之和 | 二叉树剪枝
目录 1.计算布尔二叉树的值 题解 2.求根节点到叶节点数字之和 3. 二叉树剪枝 题解 1.计算布尔二叉树的值 链接:2331. 计算布尔二叉树的值 给你一棵 完整二叉树 的根,这棵树有以下特征: 叶子节点 要么值为 0 要么值为 1 ,其…...
SOFABoot-07-版本查看
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金服开源的 s…...
蓝桥杯 之 第27场月赛总结
文章目录 习题1.抓猪拿国一2.蓝桥字符3.蓝桥大使4.拳头对决 习题 比赛地址 1.抓猪拿国一 十分简单的签到题 print(sum(list(range(17))))2.蓝桥字符 常见的字符匹配的问题,是一个二维dp的问题,转化为对应的动态规划求解 力扣的相似题目 可以关注灵神…...
第十六章:Specialization and Overloading_《C++ Templates》notes
Specialization and Overloading 一、模板特化与重载的核心概念二、代码实战与测试用例三、关键知识点总结四、进阶技巧五、实践建议多选题设计题代码测试说明 一、模板特化与重载的核心概念 函数模板重载 (Function Template Overloading) // 基础模板 template<typename…...
可视化动态表单动态表单界的天花板--Formily(阿里开源)
文章目录 1、Formily表单介绍2、安装依赖2.1、安装内核库2.2、 安装 UI 桥接库2.3、Formily 支持多种 UI 组件生态: 3、表单设计器3.1、核心理念3.2、安装3.3、示例源码 4、场景案例-登录注册4.1、Markup Schema 案例4.2、JSON Schema 案例4.3、纯 JSX 案例 1、Form…...
Amdahl 定律
Amdahl 定律是用来表示,当提高系统某部分性能时对整个系统的影响,其公式如下: a表示我们提升部分初始耗时比例,k是我们的提升倍率,通过这个公式我们可以轻松的得知对每一部分的提醒,对整个系统带来的影响…...
rust学习笔记19-泛型
Rust 的泛型(Generics)允许编写可复用的代码,通过抽象类型或行为来避免重复逻辑。 1. 泛型的基本使用 函数泛型 在函数中定义泛型参数,支持不同类型的数据操作: fn max<T: PartialOrd>(a: T, b: T) -> T …...
Linux系统之美:环境变量的概念以及基本操作
本节重点 理解环境变量的基本概念学会在指令和代码操作上查询更改环境变量环境变量表的基本概念父子进程间环境变量的继承与隔离 一、引入 1.1 自定义命令(我们的exe) 我们以往的Linux编程经验告诉我们,我们在对一段代码编译形成可执行文件后…...
数学爱好者写的编程系列文章
作为一个数学爱好者,我大学读的专业却不是数学专业,而是跟计算机有关的专业。原本我对编程一窍不通,平时上课也是在看数学文献,作业基本靠同学,考试及格就行。不过后来因为毕业的压力,我还是拥抱编程了&…...
pnpm 报错 Error: Cannot find matching keyid 解决
1. 查看corepack版本,升级至0.31.0 npm i -g corepack0.31.0 这里注意环境变量,可能升级后还是指向旧版本,可以选择更新环境变量或者删除原指向的corepack命令 2. 更新pnpm corepack install -g pnpmlatest 问题解决。...
dcat-admin已完成项目部署注意事项
必须 composer update 更新项目php artisan admin:publish 发布dcatadmin的静态资源手动创建目录(如果没有) storage/appstorage/framework/cachestorage/framework/sessionsstorage/framework/views 需检查 php不要禁用以下函数 putenvsymlinkproc_…...
Ubuntu实时读取音乐软件的音频流
文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的,我需要在Ubuntu中,实时读取正在播放音乐的音频流,然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现,好处是可以直接利用Helvum…...
大语言模型进化论:从文本理解到多模态认知的革命之路
一、Transformer:认知革命的基石 ### 1.1 自注意力机制:神经网络的"量子纠缠" python # 自注意力核心公式实现 def self_attention(Q, K, V, maskNone): d_k Q.size(-1) scores torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(…...

