《Redis 深度历险:核心原理与应用实践》学习

news2024/12/24 9:43:20

1、Redis的5种基础数据结构

Redis的5种基础数据结构:string (字符串)、list (列表 )、hash (字典)、 set (集合)、zset (有序集合)。

Redis所有的数据结构都以唯一的key字符串作为名称, 然后通过这个唯一key值来获取相应的value数据。

1.1 string (字符串)

Redis字符串是可以修改的字符串,在内存中是以字节数组的形式存在,字符串最大长度为512MB。

Redis字符串的结构叫“SDS”(Simple Dynamic String),是一个带长度信息的字节数组。

struct SDS<T> {
	T capacity; // 数组容量,表示所分配的数组长度
	T len; // 内容的实际长度
	byte flags; // 特殊标志位,不用理睬它
	byte[] content; // 数组的内容
}

在这里插入图片描述

1.2 list (列表)

Redis列表的内存结构:在列表元素较少的时候,所有的元素彼此紧挨着—起存储,分配的是一块连续的内存,这个结构是“压缩列表”(ziplist)。当列表元素较多的时候,会改成“快速链表”(quicklist)。因为普通的链表需要的附加指针空间太大,会浪费空间,还会加重内存的碎片化,比如某普通链表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。所以Redis将多个ziplist使用双向指针串起来使用,既满足了快速的插入删除性能, 又不会出现太大的空间冗余。
在这里插入图片描述

Redis列表插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。

1.3 hash(字典)

Redis字典类似于Java语言里面的 HashMap,它是无序字典,内部存储了很多键值对,结构为 “数组+链表” 。

Redis字典的值只能是字符串。

在这里插入图片描述

1.4 set (集合)

Redis集合相当于Java 语言里面的 HasbSet,它内部的键值对是无序的、唯一的。它的内部实现相当于一个特殊的字典,字典中所有的value都是一个值NULL。

1.5 zset (有序列表)

Redis有序列表的内部实现用的是 “ 跳跃列表” ,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。
在这里插入图片描述

1.6

list、set、hash、zset 这四种数据结构是容器型数据结构,它们共享下面两条通用规则:

  1. create if not exists:如果容器不存在,那就创建一个,再进行操作。比如rpush操作刚开始是没有列表的,Redis就会自动创建一个,然后再rpush进去新元素。
  2. drop if no elements:如果容器里的元素没有了,那么立即删除容器,释放内存。

Redis所有的数据结构都可以设置过期时间, 时间到了,Redis会自动删除相应的对象。


2、Redis原理

2.1 高性能

  • Redis是基于内存的数据库,所有数据都在内存中,内存的读写速度远高于硬盘。
  • Redis是单线程操作,避免了不必要的上下文切换和竞争锁机制,也不存在线程频繁切换导致CPU的消耗,所以Redis的操作速度非常快。Redis6.0引入了多线程,但执行请求命令的仍然是单线程。
  • Redis采用了非阻塞I/O和多路复用(事件轮询)。非阻塞I/O意味着线程在读写I/O时可以不再阻塞,读写可以瞬间完成。多路复用是利用epoll(linux)、kqueue(FreeBSD和macosx)可以同时监听多个流的I/O事件的能力,在空闲的时候,会把当前网络线程阻塞掉,当某些网线程有I/O事件时,就从阻塞态中唤醒,按照轮询的顺序Redis依次进行处理,这样就可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),所以Redis具有很高的吞吐量。此处“多路”指的是多个网络请求,“复用”指的是复用同一个线程。

2.2 Redis的持久化机制

2.2.1 快照

  • 快照持久化是由Redis的一个子进程来处理,子进程对数据(子进程产生时那一瞬间的数据)进行遍历读取,然后序列化写到磁盘中。
  • 快照是一次全量备份,是内存数据的二进制序列化形式。

2.2.2 AOF日志

  • AOF日志是Redis服务器的顺序指令序列,AOF日志只记录对内存进行修改的指令记录。
  • Redis会在收到客户端修改指令后,进行参数校验、逻辑处理,如果没问题,就立即将该指令文本存储到AOF日志中,也就是说,先执行指令才将日志存盘。
  • 如果机器突然宫机,AOF日志内容可能还没有来得及完全刷到磁盘中,这个时候就会出现日志丢失。
  • AOF日志在长期的运行过程中会变得无比庞大,数据库重启时需要加载AOF日志进行指令重放,这个时间就会无比漫长。

2.2.3 混合持久化

  • 重启Redis时,如果用快照恢复内存状态,会丢失大量数据,如果用AOF日志重放,会非常慢。
  • 混合持久化(Redis4.0之后提供)是将快照内容和增量的AOF日志文件存在一起,在Redis重启的时候,可以先加载快照的内容,然后再重放增量的AOF日志,重启效率得到大幅提升。

3、Redis集群

3.1 主从同步

  • Redis的主从数据是异步同步,所以分布式的Redis系统不满足一致性要求。Redis尽力保证最终一致性,从节点会努力追赶主节点,最终从节点的状态会和主节点的状态保持—致。如果网络断开了,主从节点的数据将会出现大量不—致,但一旦网络恢复,从节点会采用多种策略努力追赶,继续尽力保持和主节点一致。
  • 当客户端在Redis的主节点修改了数据后,立即返回,即使在主从网络断开的清况下,主节点依旧可以正常对外提供修改服务,所以Redis满足可用性。

3.1.1 增量同步

Redis同步的是指令流,主节点会将那些对自己的状态产生修改性影响的指令记录在本地的内存buffer中,然后异步将buffer中的指令同步到从节点,从节点一边执行同步的指令流来达到和主节点一样的状态,一边向主节点反馈自己同步到哪里了(偏移量)。因为内存的buffer是有限的,所以Redis主节点不能将所有的指令都记录在内存buffer中。Redis的复制内存buffer是—个定长的环形数组,如果数组内容满了,就会从头开始覆盖前面的内容。如果因为网络状况不好,从节点在短时间内无法和主节点进行同步,那么当网络状况恢复时,Redis的主节点中那些没有同步的指令在buffer中有可能已经被后续的指令覆盖掉了,从节点将无法直接通过指令流来进行同步。

3.1.2 快照同步

快照同步首先需要在主节点上将当前内存的数据全部快照到磁盘文件中,然后再将快照文件的内容全部传送到从节点。从节点将快照文件接受完毕后,立即执行一次全量加载。加载之前先要将当前内存的数据清空,加载完毕后通知主节点继续进行增量同步。在整个快照同步进行的过程中,主节点的复制buffer还在不停地往前移动,如果快照同步的时间过长或者复制buffer太小,都会导致同步期间的增量指令在复制buffer中被覆盖,这样就会导致快照同步完成后无法进行增最复制,然后会再次发起快照同步,如此极有可能会陷入快照同步的死循环。所以需要配置一个合适的复制buffer大小参数,避免快照复制的死循环。

3.2 Redis Sentinel(Redis哨兵)

在这里插入图片描述
Sentinel负责持续监控主从节点的健康,当主节点挂掉时,自动选择—个最优的从节点切换成为主节点。客户端来连接集群时, 会首先连接Sentinel,通过Sentinel来查询主节点的地址,然后再连接主节点进行数据交互。当主节点发生故障时, 客户端会重新向Sentinel要地址,Sentinel会将最新的主节点地址告诉客户端。如此应用程序将无须重启即可自动完成节点切换。

Redis主从采用异步复制,意味着当主节点挂掉时,从节点可能没有收到全部的同步消息,这部分未同步的消息就丢失了。
如果主从延迟特别大,那么丢失的数据就可能会特别多。Sentinel无法保证消息完全不丢失,但是也能尽量保证消息少丢失。
下面两个选项可以限制主从延迟过大:

min-slaves-to-write 1
min-slaves-max-lag 10

第一个参数表示主节点必须至少有一个从节点在进行正常复制,否则就停止对外写服务,丧失可用性。
第二个参数控制是否为正常复制,它的单位是秒(s),表示如果在10s内没有收到从节点的反馈,就意味着从节点同步不正常,要么是网络断开了,要么是一直没有给反馈。

3.3 Redis Cluster

在这里插入图片描述

Redis Cluster是Redis的“亲儿子”,它是Redis作者自己提供的Redis集群化方案,它去中心化的。

Redis Cluster将所有数据划分为16384个槽位,集群的每个节点负责其中一部分槽位,槽位的信息存储于每个节点中,当Redis Cluster的客户端来连接集群时,也会得到一份集群的槽位配置信息。这样当客户端要查找某个key时,可以直接定位到目标节点。

Redis Cluster可以为每个主节点设置若干个从节点, 当主节点发生故陓时,集群会自动将其中某个从节点提升为主节点。如果某个主节点没有从节点,那么当它发生故障时,集群将完全处千不可用状态。

Redis Cluster是去中心化的,一个节点认为某个节点失联了并不代表所有的节点都认为它失联了,所以集群还得经过一次协商的过程,只有当大多数节点都认定某个节点失联了,集群才认为该节点需要进行主从切换来容错。

Redis集群节点采用Gossip协议来广播自己的状态以及改变对整个集群的认知。
比如一个节点发现某个节点失联了(PFail即Possibly Fail),它会将这条信息向整个集群广播,其他节点就可以收到这点的失联信息。如果收到了某个节点失联的节点数量(PFail Count)已经达到了集群的大多数,就可以标记该失联节点为确定下线状态(Fail),然后向整个集群广播,强迫其他节点也接受该节点已经下线的事实,并立即对该失联节点进行主从切换。

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

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

相关文章

基于粒子群优化算法的边缘链接用于边缘检测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

艾美捷FLIVO探针:用于细胞活体凋亡检测,助力科研!

细胞凋亡在胚胎发育、造血、免疫系统的成熟以及维护正常组织和器官的细胞恒定与生长平衡&#xff0c;乃至机体衰老方面都起着重要作用。因此&#xff0c;有关凋亡的研究在临床和基础等各个领域已经广泛开展,凋亡细胞的检测方法显得非常重要。 FLIVO(荧光活体)是一种强大的无创检…

首个搭载8MP摄像头的单SoC行泊一体方案来袭,已拿下多家车企定点

行泊一体正在进入前装规模化上车的关键周期&#xff0c;但同时产品的升级战争也在全面爆发。 《高工智能汽车》了解到&#xff0c;国内领先的智能驾驶技术供应商——AutoBrain重磅推出了国内首个搭载800万像素摄像头的单SoC行泊一体方案。据悉&#xff0c;这是全球量产首发搭载…

dubbo消费者访问不到docker里面的生产者

版本 dubbo3.0.7 Docker version 20.10.21, build baeda1f docker zookeeper lastest 背景 一个dubbo的项目&#xff0c;生产者和消费者之间使用zookeeper管理。 现将消者和zookeeper部署到了docker中&#xff0c;二者使用的都是桥接网络。 消费者仍然在idea中编写逻辑。 服…

正片工艺、负片工艺,这两种PCB生产工艺的差异到底是什么?

在前文《什么是加成法、减成法与半加成法&#xff1f;》中&#xff0c;我们提到&#xff1a;减成法仍为当前PCB生产工艺的主流&#xff0c;那么&#xff0c;其中的两大代表工艺——正片工艺、负片工艺&#xff0c;又是怎样的呢&#xff1f; 请看下图&#xff1a; 当然&#xf…

一起用Go做一个小游戏(下)

打包资源使用file2byteslice包我们可以将图片和config.json文件打包进二进制程序中&#xff0c;之后编译生成一个二进制程序。然后拷贝这一个文件即可&#xff0c;不用再拷贝图片和其他配置文件了。golang有很多第三方包可以将打包资源&#xff0c;原理其实很简单——读取资源文…

面试官:使用 RocketMQ 怎么进行灰度发布?

今天来聊一聊 RocketMQ 的灰度方案。 灰度发布是指在黑与白之间&#xff0c;平滑过渡的一种发布方式。在大流量的系统中&#xff0c;如果一次升级改造范围比较大&#xff0c;或者影响内容不太确定&#xff0c;一般会采用切量的方式进行升级&#xff0c;这样可以减少生产变更带…

面试官:MySQL 中 varchar(n) 中 n 最大取值为多少?

前置知识 要回答这个问题&#xff0c;首先我们得先知道 MySQL 存储一条记录的格式长什么样子。 以 Compact 行格式作为例子&#xff0c;它长这样&#xff1a; 可以看到&#xff0c;一条完整的记录分为「记录的额外信息」和「记录的真实数据」两个部分。 这里重点讲讲记录的…

探究L298N模块烧毁的原因

目录 基础介绍 代码思路 基础介绍 L298N电机驱动版主要由两个核心组件构成&#xff1a; L298N 驱动芯片78M05 稳压器型号&#xff1a; L298N封装&#xff1a; Multiwatt15V 描述&#xff1a;电源电压&#xff1a;4.5V~46V 特性&#xff1a;过流保护(OCP)&#xff1b;过热保…

在线教程 | 用「网红项目」DeepSOCIAL 进行社交距离监测

By 超神经 内容一览&#xff1a;YOLO v4 是一个实时的、高精度的目标检测模型&#xff0c;本教程将详细讲解如何基于 YOLO v4 和 SORT 算法&#xff0c;实现在多目标条件下的人群距离检测。 关键词&#xff1a;YOLO v4 SORT 多目标检测 新冠疫情爆发初期&#xff0c;「保持…

VSCODE安装ChatGPT插件

zh1&#xff1a;首先在插件商店搜索ChatGPT中文版 然后点击安装就可以 2&#xff1a;chatGPT插件目前需要登陆账号才能使用&#xff0c;官方介绍下一个版本会有升级(不需要登陆) a:前往 ChatGPT 并登录或注册。 首先要先注册&#xff0c;注册的时候邮箱号可以填国内的也可以用…

利他合作,共赢未来 | 数商云全国渠道代理商招募政策发布

12月2日下午&#xff0c;以“利他合作&#xff0c;共赢未来”为主题的数商云全国渠道代理商招募政策发布会在广州顺利召开&#xff0c;与线上线下来自全国各地区的60家优质厂商共同解读数商云首次公开的招商政策、深入体验数商云全线产品体系&#xff0c;挖掘千亿数字化采购市场…

leecode#有效的电话号码#第十行#上升的温度

题目描述&#xff1a; 给定一个包含电话号码列表&#xff08;一行一个电话号码&#xff09;的文本文件 file.txt&#xff0c;写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式&#xff1a; (xxx) xxx-xxxx 或 xxx-xxx-xxxx。…

20个有用的Excel数据分析函数(教程含案例)

Microsoft Excel 是一种简单而强大的数据分析工具。Excel 是当今行业中广泛使用的软件应用程序,用于生成报告和业务洞察。Excel 包含超过 450 个函数,并且每年都会添加更多函数。在这里,我们介绍了那些主要用于数据分析的功能。 MAX/MIN MAX和MIN函数顾名思义。MAX将找到范…

零基础CSS入门教程(8)——CSS设置字体

本章目录1.任务目标2.css设置字体3.代码演示4.小结1.任务目标 我们前几个小结学习了&#xff0c;css的选择器&#xff0c;和及基本的改变字体颜色。我们这一小结学习一下设置字体的一些功能 2.css设置字体 (1)font-size这个是设置字体大小&#xff0c;浏览器一般默认字体是1…

剪映专业版常用快捷键(Pr 习惯)

剪映专业版提供了两组常用快捷键&#xff0c;一组适应 Final Cut Pro X 用户的习惯&#xff0c;另一组则是为了适应 Adobe Premiere Pro 用户的习惯。本文列出了剪映专业版&#xff08;v3.6&#xff09;的常用快捷键&#xff0c;以让 Pr 用户快速上手剪映。时间线相关快捷键分割…

无接触体征监测的技术和应用

近年来&#xff0c;由于传感器和微电子技术的飞速发展&#xff0c;基于智能传感器的无接触体征监测技术成为研究热点。尤其是近年来传感器技术和人工智能算法的不断创新&#xff0c;使人们在对人体生理、生化参数等进行监测时能够达到实时、精确和智能化的目的。 智能传感器主要…

软件设计师教程(三)计算机系统知识-计算机体系结构

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 安全性、可靠性与系统性能评测基础知识软件设计师教程计算机安全概述计算机的安全等级安全威胁影响数据…

Linux进程的创建

fork是一个系统调用&#xff0c;系统调用的流程&#xff0c;流程的最后会在sys_call_table中找到相应的系统调用sys_fork。&#xff0c;sys_fork的定义如下&#xff1a; SYSCALL_DEFINE0(fork) { ......return _do_fork(SIGCHLD, 0, 0, NULL, NULL, 0); }sys_fork会调用_do_fo…

web大作业:基于html+css+javascript+jquery实现智能分控网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…