redis分布式是如何实现的(面试版)

news2024/9/25 19:25:05

需要结合项目中的业务进行回答,通常情况下,分布式锁使用的场景:

集群情况下的定时任务、抢单、幂等性场景。

下面先来看一个抢卷场景:

以下情况会出现超卖情况:

因为线程会交替执行,所以线程查询优惠价的数据量后,线程2又查询优惠券的数据量,此时如果优惠券总数是1,最后优惠券的数量会变成-1,出现超卖。

使用synchronized解决:

但在集群的情况下,这种方式会失效,因为synchronized是本地锁,这个锁属于JVM,每个服务都有各自的JVM,它只能解决同一个JVM下线程的互斥:

此时需要加分布式锁:

redis分布式锁

                                                                        图1-1 

上图中,必须设置锁的超时时间,否则当服务宕机的时候就不会释放锁了。

redisson实现的分布式锁如何合理控制锁的有效时长

继续看图1-1,因为加锁的时候给了一个失效时间,假如业务的执行时机太长,已经超出了锁的释放时间,但此时业务还没有执行完成,假如其他线程来获得锁就会获得成功

出现这种情况后,可以给锁续期:redisson实现的分布式锁-执行流程:

  1. 有一个线程(线程1)过来,它获取锁并加锁成功后,然后就会去操作redis
  2. 加锁成功后,会另开一个线程(Watch dog)监控  持有锁的线程给持有锁的线程 增加锁的持有时间(续期)。续期的规则为每隔 releaseTime/3(releaseTime是锁的过期时间) 的时间做一次续期,默认为10秒。
  3. 手动释放锁,手动释放锁之后,需要通知对应线程的Watch dog不需要再监听了

                                                                        图2-1

假如,现在又来了一个新的线程(线程2),想获取锁,它先尝试去加锁,如果加锁成功,和 图2-1的流程是一样的,但如果没有加锁成功呢?在redisson实现的分布式锁中,它设置了一个while循环来不断的尝试去加锁,如果加锁成功了就成功了,如果线程1一直没有释放锁,线程2有一个阈值,只要循环到了阈值,线程2就会获取锁失败,这种机制会在高并发下,大程度增加分布式锁的性能:

下图为redisson的使用,所有的redisson命令基于lua脚本完成,保证脚本执行的原子性

redisson实现的分布式锁是否可以重入

首先分析下图的代码:

  • 在add1中尝试获取了锁,再去调用add2,add又去尝试获取锁,此时都是同一个线程,可以重入。

回答:可以重入,判断是否是当前线程,通过线程id去判断,如果是同一个线程就可重入,否则不能

redisson中可重入的实现

使用hash类型来存储锁数据(线程的唯一标识和重入次数):

  • 每加一次锁,重入次数都会+1,每释放一次锁重入次数-1,全部释放完变成0后删除锁信息。

redisson实现的分布式锁可以保证主从一致吗

不能解决,但可以使用红锁保证主从一致,但性能太低,一般项目中用的不多,哪有服务器天天挂;如果想要保证数据的强一致性就去使用CP思想的zookeeper。

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

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

相关文章

学习C语言(18)

整理今天的学习内容 1.strcmp的使用和模拟实现 strcmp是用来比较字符串的大小的 比较方式:比较两个字符串中对应位置上字符ASCII码值的⼤小 第⼀个字符串大于第二个字符串,则返回⼤于0的数字 第⼀个字符串等于第二个字符串,则返回0 第⼀…

Mac M1 Max配置torch-geometric等深度学习库

前提:此电脑中已经安装好了Anaconda环境 (一)查看创建的虚拟环境中torch的版本 import torch torch.__version__(二)针对安装的 torch 版本,去官网下载torch-geometric 依赖的对应版本 torch-sparse、tor…

OpenMax算法详解:深度学习中的高效开集识别技术

OpenMax算法详解:深度学习中的高效开集识别技术 在深度学习领域,模型的识别能力往往受限于其训练数据集的范畴。传统的分类模型,如卷积神经网络(CNN)或循环神经网络(RNN),通常被设计…

《大道平渊》· 拾捌 —— 证明自己,本身就毫无意义。

《大道平渊》 我在任何时候都会保持最轻松的状态,选择最舒适的态度和动作。 我在与人交谈时,无论何时何地,都会像在家里躺着和挚友交谈一样轻松。 我总是悠然自若,因为我深知自己的过度表现,只会给人留下怪异的印象。…

django学习入门系列之第十点《django的快速上手》

文章目录 快速上手app注册【settings.py】编写URL和视图的对应关系【urls.py】编写视图函数【views.py】启动django启动网页静态文件路径修改 往期回顾 快速上手 app注册【settings.py】 注意,创建了不代表注册了 操作,在settings里面添加这个 # 一…

002、架构_详解(重点)

GoldenDB 分布式数据库框架 DN和RDB增加了备节点;引入新模块CM,且GTM、MDS、PM、CM都增加备节点;MDS、PM、CM、RDB被统一在了管理节点之中;GTM和MDS间多了一条连线,因为GTM的切换由MDS把控;初步系统架构mysqld:一般称为DB节点,负责单个节点的数据处理; dbproxy:一般…

新手该如何选择与小程序定位相关的关键词

关键词的优化是提高小程序排名的关键步骤之一,所以如何选择与小程序定位相关的关键词是一个很重要的过程,需要考虑多个因素以确保关键词既符合小程序的业务特性,又能吸引目标用户。以下是一些具体的步骤和建议: 1. 深入了解小程序…

<WPF> logic tree 和 visual tree 到依赖属性和路由事件--烂尾睡觉

logic tree 逻辑树通常与 XAML 文件中的元素直接对应。The logical tree comprises the elements as they are listed in the XAML. 用途: 数据绑定:逻辑树用于数据绑定机制,帮助控件获取其父级的属性或数据上下文。事件处理&…

Telnet详解与应用——从原理到实战模拟

1. 引言 在现代网络管理中,远程访问和控制设备的能力至关重要。Telnet是一种经典的远程访问协议,尽管在安全性方面逐渐被SSH等更现代化的协议取代,但其在早期网络管理中的广泛使用使其成为网络工程师的基本技能之一。本文将深入探讨Telnet的…

Shader 透明相关

1、设置深度写入与渲染队列 深度写入 深度写入默认是开启,需要通过渲染状态中的 ZWrite off 指令主动关闭深度写入 当我们把它写在Pass渲染通道中时,它只会影响该Pass 若我们把它写在SubShader语句块中,它将影响其中的所有Pass …

Dubbo负载均衡的5种策略及适用场景

Dubbo负载均衡的5种策略及适用场景 1. Random LoadBalance(默认)2. RoundRobin LoadBalance3. LeastActive LoadBalance4. ConsistentHash LoadBalance 💖The Begin💖点点关注,收藏不迷路💖 Dubbo为优化服务…

Web攻防之应急响应(一)

目录 1. 前言 2. 靶场准备 3. 应急场景 4. 应急实战 4.1 查看服务器开放端口 4.2 通过远程链接工具连接服务器 4.3 寻找中间件日志 4.4. 查看并下载日志 4.5 初步分析日志 4.6 查看安全分析报告 4.6 从被篡改的页面开始 4.6 通过修改的文件时间进一步分析日志信息 4.…

零基础学PLC的指令-位逻辑指令(1)

1、常开触点: 它是一个逻辑开关,可以理解为是电气控制图中的常开按钮,这个逻辑开关是否接通是受寻址的结果而决定的,若I0.0(按位寻址)的寻址结果为“1”,这个逻辑开关就会导通,若寻…

2.2.2 Posix API与网络协议栈 3

3 断开连接 四次挥手 不分客户端,服务器,只分主动方和被动方 主:tcp包里fin这一位 置1被:回,ack这一位 置1被: fin1主:ack1 与posix api关系,调用了close() ,不是网络…

数据库mysql集群主从、高可用MGR、MHA技术详解

一、安装数据库mysql步骤 环境:红帽7.9系统 安装依赖 yum install cmake gcc-c openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 -y 将下载的MySQL软件包解压并cd到mysql的目录下 [rootmysql-node10 ~]# tar zxf mysq…

新手小白Ubuntu18.04超详细安装教程

1、Ubuntu18.04系统下载地址 Ubuntu18.04下载地址 直接下载桌面版 2、Ubuntu18.04安装 (1)打开VMware虚拟机 文件—>新建虚拟机—>选择典型 (2)选择稍后安装系统 (3)选择linux系统,…

Linux常用应急排查命令(持续更新)

1、history (1)使用history查看历史命令,分析攻击者使用过何命令 history(2)但攻击者也能回使用history -c 清除掉历史命令 history -c(3)使用cat查看cat /root/.bash_history 文件也可以查看…

C++入门基础知识35——【关于C++ 存储类之mutable 存储类thread_local 存储类】

成长路上不孤单😊【14后,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊!!!!&#xff…

CentOS安装使用教程与集群环境搭建

文章目录 一、下载CentOS镜像1. 下载 二、创建虚拟机三、CentOS安装、克隆与配置1. 安装CentOS2. CentOS虚拟机克隆2.1 介绍2.1.1 完全克隆 (Full Clone)2.1.2 链接克隆 (Linked Clone) 2.2 克隆虚拟机 3. CentOS虚拟机配置3.1 修改主机名3.2 配置虚拟机网络3.3 配置网络参数3.…

C:回调函数的介绍-学习笔记

前言: 本篇文章我们将继续指针相关知识:回调函数 希望大家在看完后能够有所收获! 回调函数 定义与概念 回调函数是一个通过指针调用的函数。 如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时&…