当前位置: 首页 > article >正文

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的逆操作。

文章结束,感谢观看


http://www.kler.cn/a/595895.html

相关文章:

  • Linux(Ubuntu)系统安装Docker与Docker Compose完整指南
  • 【NLP】 API在大语言模型中的应用
  • 【MATLAB例程】基于TDOA定位(两步最小二乘)的三维轨迹定位和UKF滤波,TDOA的锚点可以自适应,附完整代码
  • AWS CDK实战:用代码重新定义云基础设施部署
  • Python 爬虫(4)HTTP协议
  • 【Vitis AIE】FPGA快速部署ConvNet 示例MNIST数据集
  • [HelloCTF]PHPinclude-labs超详细WP-Level 4-http协议
  • 无人机4G双链路技术分析!
  • DeepSeek R1 本地部署指南 (2) - macOS 本地部署
  • 美团Leaf分布式ID实战:深入解析雪花算法原理与应用
  • docker常见的命令详细介绍
  • Mysql-经典实战案例(10):如何用PT-Archiver完成大表的自动归档
  • CSS中的伪类与伪元素:让样式更加灵活优雅
  • 【SpringBatch】04九张批处理表、作业控制:启动 停止 重启
  • 可发1区的超级创新思路:基于注意力机制的DSD-CNN时间序列预测模型(功率预测、交通流量预测、故障检测)
  • Windows10抓包工具Wireshark下载、安装、使用
  • 10.PE导出表
  • Apache DolphinScheduler:一个可视化大数据工作流调度平台
  • 软考教材重点内容 信息安全工程师 第20章 数据库系统安全
  • 解决项目使用eslint+prettier,启动报错: error Delete `␍` prettier/prettier