一、概述

首先引入分布式锁指的是应用程序引入,不是Redis本身引入,Redis作为中间件可以作为分布式锁的一个典型实现方案,同时也有一些其他的实现方案。分布式锁指的是一个/组程序,使用Redis实现的话就是通过添加一个特殊的Key-Value,在其他服务器想要进行操作时(例如买票操作),会先检查这个Key-Value是否存在,如果存在就会加锁失败,而Redis的Set NX操作正好满足,它只有在不存在才能设置成功,解锁命令则可以使用del命令删除对应的Key-Value即可。但是这些都是在理想的情况下,在实际场景中,可能出现的情况则复杂多样。

二、可能存在的问题及参考方案

1.服务程序在加锁后还未完成操作就崩溃了

这个问题在单线程中没什么关系,但是在分布式系统中就会影响其他的服务器程序获取锁,参考方案就是加锁时引入超时时间,即Set NX PX命令,保证即使一个程序出现突发情况也不会影响其他程序的使用,值得注意的是这个操作必须写成一步,不能先加锁,再给锁设置超时时间,因为Redis事务的原子性比较弱(现在可能直接说没有原子性)。

2.锁通用导致误解锁

设想一下这个场景,A先加锁,B执行解锁,原本它们是各做各的,但是在它们之间有个C在尝试加锁,B的解锁操作就因为不知道是C加的锁而直接将C刚加上的锁给误删了。

参考解决方法就是给每个服务器程序都进行编号,如使用UUID或者进程号+线程号等方式,在设置锁时就可以将Key设为针对哪个资源进行加锁,Value则使用服务器的唯一编号。

3.解锁操作无原子性导致的误解锁

在解锁时无法向加锁一样使用一条指令就可以完成,需要1.通过Get获取锁。2.执行Del操作。这么问题来了,在1和2之间如果有一个新的服务器程序对这个资源进行了加锁,2操作就会导致该服务器新加的锁无了。这个问题的主要原因就是解锁操作无原子性。

参考解决方法是引入Lua脚本来实现Get和Del操作,Lua脚本的好处是它可以在一个脚本中执行多条指令,但是Redis本身将它视为一个操作,这样就保证了原子性。

4.超时时间续约问题

因为超时时间是提前设置好的,太长会影响其他程序,太短又会导致操作还没完成锁就过期了,这样的话就很麻烦。

参考解决方法是在每次加锁成功后就唤醒一个守护线程,一般称为“看门狗”线程,该线程会持续检查剩余超时时间,比如设置超时时间1000ms,让该线程在超时时间剩余300ms时进行超时时间重置,当客户端完成操作或者奔溃后就停止续约线程。

5.集群模式下的情况

单点模式下如果Redis挂了,那就是挂了,没什么好方法。如果是集群模式下,一个主节点完成加锁操作后,在还没来得及向从节点同步时就挂了,那么当从节点称为新的主节点后,因为没有加锁的命令,就会导致重复加锁操作。

参考解决方法是引入Redlock算法,该算法会向所有的主节点发送加锁指令,当有超过半数节点都认为加锁成功了,那即使有部分节点加锁失败,也认为是加锁成功了,当解锁时向所有节点发送Del命令,即使该节点没有加锁。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

prometheus-2.42.0.linux-amd64.tar.gz 安装配置展示

一、prometheus 1.1解压文件 # tar -xzvf prometheus-2.42.0.linux-amd64.tar.gz -C ~/apps/ prometheus-2.42.0.linux-amd64/ prometheus-2.42.0.linux-amd64/NOTICE prometheus-2.42.0.linux-amd64/consoles/ prometheus-2.42.0.linux-amd64/consoles/index.html.example p…

Linux 标准输入 标准输出 标准错误

目录一. 简介二. 常见用法2.1 输出重定向2.2 错误重定向2.3 同时重定向标准输出 错误2.4 输入重定向2.5 特殊设备三. 这样设计的好处3.1 区分正常信息和错误信息3.2 方便调用方脚本处理3.3 与管道结合时更清晰四. 案例4.1 if判断4.2 ls查询一. 简介 ⏹在 Linux/Unix 中&#…

零基础新手小白快速了解掌握服务集群与自动化运维(二)Linux Journalctl命令、Journalctl日志持久化存储

Linux提供了一个强大的日志系统,它可以跟踪和记录系统的各种活动。在这个系统中,journalctl是一个非常重要的工具,用于查询和操作由systemd进程管理的日志。 本文将深入探讨journalctl命令,介绍其基本使用、高级选项及示例等内容…

【学习】【js】栈数据结构

栈 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。 基于数组的栈 时间复杂度O(n),占用较多的…

【Linux】基本指令 · 下

alias 指令起别名为什么 ls -l 指令等价于 ll 指令呢?指令就是可执行程序,和我们自己写的代码编译好的程序,没有本质区别! 指令在系统的某一个位置存在! 执行指令前,现在系统中查找对应的指令指令在根目录下…

计算机视觉(opencv)实战二十二——指纹图像中提取特征点,计算两两指纹之间的相似度

指纹识别原理与代码实现详解指纹识别是一种常见的生物特征识别技术,广泛应用于门禁系统、手机解锁、考勤打卡、身份认证等场景。其核心思想是:从指纹图像中提取特征点,计算两幅指纹之间的相似度,并根据相似度判断是否为同一人。本…

Linux基础之部署mysql数据库

文章目录一、环境准备二、源码解压与依赖三、CMake 编译配置四、配置 MySQL权限管理修改配置文件 /etc/my.cnf五、环境变量设置六、数据库初始化七、服务管理八、账号密码管理一、环境准备 yum -y install gcc gcc-c ncurses ncurses-devel bison cmakegcc / gcc-c&#xff1a…

代码审计-PHP专题原生开发文件上传删除包含文件操作监控Zend源码解密1day分析

快速分析脆弱:1、看文件路径2、看代码里面的变量(可控)3、看变量前后的过滤文件安全挖掘点:1、脚本文件名2、应用功能点3、操作关键字文件上传,文件下载(读取),文件包含,文件删除等emlog-文件上…

零基础搭建 Hexo 博客:从本地到 GitHub Pages 全流程指南

零基础搭建 Hexo 博客:从本地到 GitHub Pages 全流程指南 Hexo 是一个快速、简洁且高效的博客框架,支持使用 Markdown 来编写文章,并能快速生成静态网页,非常适合想要搭建个人博客的同学。本文将带你从零开始,本地搭建…

Git 简介

Git 是目前全球最流行的分布式版本控制系统(Distributed Version Control System, DVCS),核心作用是追踪文件修改历史、支持多人协同开发,并能高效管理代码(或任何文本类文件)的版本迭代。它由 Linux 内核创…

后端Web实战-Spring原理

目录 1. 配置优先级 2. Bean管理 2.1 获取Bean 2.2 Bean作用域 面试题:Lazy是如何解决循环依赖问题的? 2.3 第三方Bean 3. SpringBoot原理 3.1 起步依赖 3.2 自动配置 3.2.1 概述 3.2.2 自动配置的原理及常见方案 3.2.2.1 概述 3.2.2.2 方案…

在 Qoder 等 AI 二创 IDE 里用 VS Code Remote-SSH 的“曲线连接”实战

目标:让你在 Qoder 等在线/AI 辅助 IDE 中,也能像本地 VS Code 一样通过 Remote-SSH 连接到自己的远程服务器进行开发。 前提:只在你拥有或被授权的服务器上使用,遵守所用平台的条款与限制。两句话说清楚 先用本地 VS Code 正常连…

python发送请求SSL验证设置

这个错误通常是由于SSL/TLS握手失败导致的,可能原因包括证书验证问题、不兼容的加密协议或网络连接中断。以下是几种解决方案,按推荐顺序排列: 方案一:临时禁用SSL验证(快速测试) response requests.get(u…

工厂自动化正从 “人工堆叠” 向 “设备替代” 快速转变

​人工进行零件排列,虽在操作灵活性上有一定表现,但实际应用中存在明显短板,对工厂自动化转型形成制约。从成本来看,一名工人日均工资约数百元,若需 5-6 名工人协同作业,月均人力成本易突破万元&#xff0c…

中标麒麟7.4部署gitlab-runner

1. 部署环境 本次部署环境完全断网。需要离线下载gitlab-runner及其依赖。 本次部署环境为中标麒麟7.4。目前机器上部署了gitlab,安装了maven。 2. 部署步骤 2.1 在外部下载好依赖 我首先在腾讯云上布置了一个centos7.9的虚拟机,没有安装任何东西。 …

在 IDEA 2024 创建 Vue 项目(保姆级)

目录 一、 前后端分离 1. 简介 2. 实现前后端分离的常用前端框架 3. 前后端分离和动静分离 3.1 前后端分离: 3.2 动静分离: 二、 Vue.js概述 1. 简介 2. SPA介绍 2.1 优点 2.2 缺点 3. MVVM介绍 3.1 示例 三、 名词解释 1. Node.js 2. npm 3. webpack 4. Vue…

Coze源码分析-资源库-创建知识库-后端源码-应用/领域/数据访问

3. 应用服务层 3.1 知识库应用服务 文件位置: backend/application/knowledge/knowledge.go func (k *KnowledgeApplicationService) CreateKnowledge(ctx context.Context, req *dataset.CreateDatasetRequest) (*dataset.CreateDatasetResponse, error) {// 1. 转换文档类型d…

Shopify指纹手机矩阵:无限扩店,横扫FB/GG广告封号风险

一、 为什么需要为Shopify使用指纹手机?虽然Shopify不会因为你多开店而封号,但以下场景需要隔离环境:规避广告平台关联:这是最核心的用途。你会用Facebook、Google、TikTok等广告平台为你的Shopify店铺引流。这些广告平台严格禁止…

【Python】家庭用电数据分析Prophet预测

数据集:Household Electricity Consumption | Kaggle 目录 数据集简介 探索性分析 Prophet预测 Prophet模型 Prophet理念 Prophet优点 数据集简介 240000-household-electricity-consumption-records数据集包含了一个家庭6个月的用电数据,收集于2…

信息系统运维管理

运行维护服务指的是采用信息技术手段及方法,依据客户提出的服务要求,为其在使用信息系统过程中提出的需求提供的综合服务是信息技术服务中的一种主要类型。运行维护服务对象是指信息系统工程建设项目交付的内容,包括机房基础设施,…