面试篇-Redis-3+分布式锁+集群部署

news2024/12/23 18:47:30

文章目录

  • 前言
  • 一、你们项目中使用Redis 作为分布式锁吗
    • 1.1 将余券存入到Redis 中,当有人抢券进行-1操作并存回:
    • 1.2 分布式锁的使用
    • 1.3 Redis 分布式锁是怎么实现的:
    • 1.4 Redisson 分布式锁是可重入的吗:
    • 1.5 Redis 出现脑裂时如何保证数据的一致性
  • 二、你都知道Redis 集群的哪些部署方式
    • 2.1 主从部署
      • 2.1.2 主从架构图:
      • 2.1.2 主从数据的同步是怎么做的:
    • 2.2 哨兵模式:
    • 2.2.1 哨兵模式架构:
    • 2.2.2 Sentinel的选举:
    • 2.2.3 哨兵模式下的脑裂问题:
    • 2.3 分片模式:
      • 2.3.1 分片架构:
      • 2.3.2 分片是怎么实现的:
    • 三、Redis 单线程为什么还能保证高吞吐
    • 3.1 Redis 高性能的三个原因:
    • 3.2 Redis的线程网络模型:
      • 3.2.1 单线程模型:
      • 3.2.2 多线程模型:
    • 3.3 Redis 的IO多路复用:
  • 总结


前言

你们项目中使用过Redis 作为分布式锁吗,你们是怎么实现的,锁过期怎么办,redis 脑裂怎么办,Redis 真能保证一致性吗,本文重点对面试的问题进行介绍,祝愿每位程序员都能上岸!!!。


一、你们项目中使用Redis 作为分布式锁吗

分布式锁通常被用在对公用的资源进行修改时使用,如分布式任务调度,抢单等场景;

1.1 将余券存入到Redis 中,当有人抢券进行-1操作并存回:

在这里插入图片描述
如果按照上面的代码进行,在并发场景下很有可能出现超卖的情况:
在这里插入图片描述此时就可以考虑使用分布式锁进行加锁处理超卖的问题;

1.2 分布式锁的使用

每个线程进入该方法后,都需要先获取到一把全局的排他锁,只有获取到了锁的线程才能进入优惠券余量的查询,然后扣减库存操作,最后在进行锁的释放,获取不到锁的线程则无法抢券。
在这里插入图片描述

1.3 Redis 分布式锁是怎么实现的:

Redis实现分布式锁主要利用Redis的setnx命令。setnx是SETif not exists(如果不存在,则 SET)的简写。
在这里插入图片描述

 为了防止死锁,通常在使用setnx 时,需要为key 设置一个过期时间,那么锁的过期时间又应该怎么设置;  Redisson中提供了看门狗功能,
 来进行锁的自动延期。看门狗是一个线程,默认每隔10s 去查看主线程的任务是否结束,如果没有结束就进行所得续期,
 依次来保证主线程在任务执行完成之前一直持有锁。

在这里插入图片描述
这里注意一个使用上的细节:
加锁和设置过期时间,都是通过lua 脚本保证其原子性;这里如果传入了锁的过期时间,则不会启用看门狗进行锁的续期 ;

在这里插入图片描述

1.4 Redisson 分布式锁是可重入的吗:

Redisson 实现的分布式锁 底层数据结构,保存了当前持有锁的线程,和锁的重入次数,所以它是支持锁的重入;

在这里插入图片描述

1.5 Redis 出现脑裂时如何保证数据的一致性

redis 分布式锁-数据主从一致性问题:主节点还没有将锁的key 信息同步到从节点,此时主节点宕机后,通过选举上位的主节点没有锁信息,此时线程在来获取锁就成功了,丢失了所的互斥性。针对此场景Redis 提供了红锁来支持
在这里插入图片描述

RedLock(红锁):不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁(n/2+1),避免在一个redis实例上加锁;红锁实现起来比较复杂,而且并发性能差,redis 官网也不推荐使用。
在这里插入图片描述

Redisson锁不能解决主从数据一致的问题吗
不能解决,但是可以使用redisson提供的红锁来解决,但是这样的话,性能就太低了,如果业务中非要保证数据的强一致性,建议采用zookeeper实现的分布式锁;

二、你都知道Redis 集群的哪些部署方式

2.1 主从部署

一个Master 多个Slave,Master 负责数据的写入,Slave 可以负责数据的读取;单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。

2.1.2 主从架构图:

在这里插入图片描述

2.1.2 主从数据的同步是怎么做的:

1)全量同步过程:
在这里插入图片描述

  • 从节点与主节点建立连接,发送replid 和offset;
  • 如果是第一次同步,则返回给从节点 replid 和offset,从节点进行保存;
  • 然后通过bgsave 生成rdb 文件,并且发送给从节点;
  • 从节点清空本地数据 ,然后加载rdb;
  • 后续同步,则通过offset 将新产生的数据 发送给到从节点;

2)增量同步过程:

因为slave 已经保存了offset 漂移量,此时主节点只需要将offset 之后的数据给到slave 即可;
在这里插入图片描述

2.2 哨兵模式:

主从模式下,当主节点出现故障后,无法再响应写入请求,此时必须手动将其中的一个slave 置为Master 节点才能继续提供服务;这样显然太麻烦了。可以使用哨兵模式对redis 的主从节点进行监控,并且当主节点下线后也可以触发自动选举Master。

2.2.1 哨兵模式架构:

代码如下(示例):
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:

  • 监控:Sentinel会不断检查您的master和slave是否按预期工作;
  • 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主;
  • 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端;

2.2.2 Sentinel的选举:

Sentinel 会检查集群内的所有节点,如果Master 下线则会触发选举;

服务状态监控如下:

  • Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:
  • 主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。
  • 客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。
    在这里插入图片描述

哨兵选主规则:

  • 首先判断主与从节点断开时间长短,如超过指定值就排除该从节点;
  • 然后判断从节点的slave-priority值,越小优先级越高
  • 如果slave-prority一样,则判断slave节点的offset值,越大优先级越高
  • 最后是判断slave节点的运行id大小,越小优先级越高。

2.2.3 哨兵模式下的脑裂问题:

出现网络问题,触发了集群的选举,然后后续网络恢复后,集群出现两个主节点,新晋升的主节点将老的主节点强制降级为从节点,如果出现网络问题时,redis 客户端还是连接了老的主节点进行了数据的写入,此时老的主节点被降级为从节点后,则会造成数据丢失;我们可以修改redis的配置,可以设置最少的从节点数量以及缩短主从数据同步的延迟时间,达不到要求就拒绝请求就可以避免大量的数据丢失。
在这里插入图片描述

2.3 分片模式:

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

  • 海量数据存储问题;
  • 高并发写的问题;

2.3.1 分片架构:

在这里插入图片描述

使用分片集群可以解决上述问题,分片集群特征:

  • 集群中有多个master,每个master保存不同数据
  • 每个master都可以有多个slave节点
  • master之间通过ping监测彼此健康状态
  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点;

2.3.2 分片是怎么实现的:

Redis 分片集群引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。

在这里插入图片描述

三、Redis 单线程为什么还能保证高吞吐

Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度;

3.1 Redis 高性能的三个原因:

  • Redis是纯内存操作,执行速度非常快
  • 采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题
  • 使用I/O多路复用模型,非阻塞IO

3.2 Redis的线程网络模型:

3.2.1 单线程模型:

在这里插入图片描述

3.2.2 多线程模型:

redis 最新的版本 在命令解析和结果返回时都使用多线程模型,在命令执行时,是单线程串行执行
在这里插入图片描述

3.3 Redis 的IO多路复用:

IO多路复用:是利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。
在这里插入图片描述

此外:select 模型底层是使用数组来存储socket 的所以连接socket的数量有一定限制;poll模型底层使用链表来存储socket 所以socket 的连接是没有限制的,但是poll 和select 一样都需要不断地进行轮训来获取到哪个socket 就绪;而epoll 提供了事件监听机制,可以在有socket 连接或者可读写的时候 进行通知;


总结

本文对Redis 的主从,哨兵,分片三种集群部署进行介绍,并对Redis 分布式锁的使用问题进行概括。

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

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

相关文章

Java项目:基于SSM框架实现的班主任助理管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的班主任助理管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功…

防水头灯在户外探险的应用_鼎跃安全

随着我国民众生活品质的显著提升,人们对户外探险的热爱与参与度也日益高涨。在这一充满挑战与未知的旅途中,拥有一件可靠的照明设备成为了确保安全与探索乐趣的关键。面对户外多变的自然环境,包括突如其来的降雨、潮湿的森林小径等恶劣条件&a…

c++ primer plus 第15章友,异常和其他:友元类

c primer plus 第15章友,异常和其他:友元类 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:友元类 提示:写完文章后,目录可以自动生成,如何生成可参考右边的…

阳光倒灌试验太阳辐射系统日光模拟器

太阳光模拟器概述 太阳光模拟器是一种能在实验室环境下模拟太阳光照射特性的设备,广泛应用于材料科学、能源研究、环境科学等领域。通过模拟太阳光的光谱分布和辐射强度,太阳光模拟器可以为科研和工业提供稳定且可重复的光照条件,进而对材料…

如何隐藏和保护Excel表格中的敏感数据?

日常办公过程中,我们难免会遇到一些涉及个人隐私或商业机密等数据,那么该如何保护这些数据?现在,我将告诉你如何保护这些数据。 一、障眼法 我们选中要保护的数据,然后点击鼠标右键,选择设置单元格格式。选…

【WEB前端】---HTML---结构---笔记

目录 1.标签---单标签和双标签 1.1单标签 1.2双标签 2.基本结构标签 2.1HTML标签 2.2文档头部标签 2.3文档标题标签 2.4文档的主题标签 3.常用的标题标签 (n∈[1,6]) 4.段落标签 5.换行标签 6.文本格式化标签 6.1粗体 6.2倾斜 6.3删除线 6.4下划线 7.div和spa…

9.x86游戏实战-汇编指令mov

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

Linux上快速定位Java代码问题行

生产环境中,经常会遇到CPU持续飙高或内存、IO飙高,如何快速定位问题点是很多新手头疼的问题,只能通过经验和代码推理,其实这里针对Java程序可以通过top和jstack命令,快速定位到问题代码。 Top命令的输出 具体定位之前…

ubuntu20.04配置调试工具

1.准备工作&#xff1a;安装g或者gdb sudo apt updatesudo apt install gg --versionsudo apt install gdbgdb --version 2.配置环境 2.1在本地新建一个main.cpp #include <iostream> #include <vector> #include <string>using namespace std;int main(…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 31 节&#xff09; P31《30.数据持久化-关系型数据库》 上一节中学习了使用用户首选项的方式实现数据持久化&#xff0c;但用户首…

DC/AC电源模块:效率与可靠性兼备的能源转换解决方案

BOSHIDA DC/AC电源模块&#xff1a;效率与可靠性兼备的能源转换解决方案 随着科技的迅速发展和人工智能技术的逐渐成熟&#xff0c;各种电子设备的需求也日益增加。然而&#xff0c;这些设备往往需要不同的电压和电流来正常工作&#xff0c;而供电方式却可能不尽相同。这时&am…

miniprogram-to-uniapp-微信小程序转换成uniapp项目

文章目录 参考:miniprogram-to-uniapp使用指南第一步第二步第三步第四步【miniprogram-to-uniapp】转换微信小程序”项目为uni-app项目(新版本工具已经支持各种小程序转换) 参考: 小程序技能树 uni-app基础知识总结 miniprogram-to-uniapp使用指南 第一步 win + R 输入…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验15 网络故障导致的路由环路问题

一、实验目的 1.验证因网络故障而导致的静态路由的路由环路问题&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证网络故障导致的…

Stable Diffusion图像的脸部细节控制——采样器全解析

文章目录 艺术地掌控人物形象好易智算原因分析为什么在使用Stable Diffusion生成全身图像时&#xff0c;脸部细节往往不够精细&#xff1f; 解决策略 局部重绘采样器总结 艺术地掌控人物形象 在运用Stable Diffusion这一功能强大的AI绘图工具时&#xff0c;我们往往会发现自己…

web学习笔记(七十五)

目录 1.小程序修改响应式数据 1.1修改基本数据类型的值 1.2修改复合数据类型的值 2. 发送请求 3.小程序解决跨域问题 1.小程序修改响应式数据 1.1修改基本数据类型的值 在小程序中需要先将data中的数据拿过来并结构&#xff0c;才可以在this.setdata中修改数据&#xf…

充分利用智慧校园人事系统,提升党政职务管理

智慧校园人事系统中的党政职务管理功能&#xff0c;是专为高校及教育机构设计的&#xff0c;旨在高效、精确地处理与党政职务相关的各类事务&#xff0c;包括职务任命、任期管理、职责分配、考核评估等&#xff0c;以信息化手段促进党务及行政工作的透明化、规范化。 该模块首先…

14-5 小语言模型SLM 百科全书

想象一下这样一个世界&#xff1a;智能助手不再驻留在云端&#xff0c;而是驻留在你的手机上&#xff0c;无缝理解你的需求并以闪电般的速度做出响应。这不是科幻小说&#xff1b;这是小型语言模型 (SLM) 的前景&#xff0c;这是一个快速发展的领域&#xff0c;有可能改变我们与…

转让北京文化传媒公司带营业性演出经纪许可证

影视文化传播倡导将健康的影视文化有效传播给观众&#xff0c;从而构建观众与电影制作者的良 性沟通与互动&#xff0c;是沟通电影制作者与电影受众的重要桥梁。影视文化泛指以电影&#xff0c;电视方式所进行的全部文化创造&#xff0c;即体现为电影&#xff0c;电视全部的存在…

探索企业知识边界,鸿翼ECM AI助手开启智慧问答新时代

在信息化迅速发展的当下&#xff0c;企业积累的数字文档数量巨大&#xff0c;这些文档中蕴含的深层信息对业务发展至关重要。然而&#xff0c;传统的搜索技术常常因只能进行关键字查询而无法满足对文档深层次理解的需求。 据Gartner调查&#xff0c;高达47%的员工在寻找有效工…

制造企业真的需要数字化转型吗?一文讲透:为何做,如何做?

此前拜访了不少制造企业&#xff0c;其以中小型企业居多&#xff0c;在与企业负责人交流数字化转型话题时&#xff0c;感触最多的还是管理者对“数字化转型”的认知。 在数字化转型方面从国家层面到地方政府进行大量的宣传与政策支持&#xff0c;部分行业头部企业也从数字化转…