【redis笔记】分布式锁

什么需要分布式锁

分布式场景下,原单机的多进程多线程并发控制策略会失效,典型的像海量key分布在redis集群中,那么对这些key的并发修改操作就不像单机那样容易保证有序(单机的锁只对单机有效),这时就需要使用分布式锁来实现并发控制。
通常可以有以下几种分布式锁实现方式:

  • 基于数据库实现
  • 基于redis实现
  • 基于Zookeeper实现

我们可以使用redis来实现分布式的锁来控制分布式应用的并发策略。利用的是setnx在已经设置值后,会返回0的特性。

怎么避免分布式锁一直被占用

通常我们需要避免某个任务一直占用锁导致其他任务无法顺利执行的场景,我们可以通过设置锁的过期时间来让锁自动失效。
为了上锁后如果出现redis服务异常,导致过期时间设置失败,一般上锁时要同步进行过期时间设置,如下上锁并设置lock过期时间10秒

set lock 1 nx ex 10

怎么避免锁被误删除

考虑以下场景,A加了一把锁,过期时间3秒,在手动释放锁之前过期了,B这时加锁进行了自己的操作,这时A执行到了解锁,就会导致A把B加的锁删除了
一种有效的解决方案是每个具体的服务生成一个uuid,当我们加锁时,我们把值设置成自己的uuid,释放锁的时候去获取此时锁的uuid值,如果一样就释放,不一样就不释放。
但由于比较和删除的操作不是原子的,如果我们比较是否相等之后,还没删除,就过期了,如果刚好被另外一个服务抢占了,那么还是会误删除。为了解决这个问题,我们也可以使用LUA脚本来保证执行的原子性

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

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

相关文章

Xilinx FPGA——ISE时序约束“建立时间不满足”问题解决记录

一、现象 最近使用赛灵思的FPGA设计项目时,出现时序约束失效问题。 点进去发现如下: 一个始终约束没有生效,有多处报错。 二、原因 出现这个问题的原因是,建立时间不满足。 时序违例的主要原因是建立时间和保持时间不满足要求&a…

服务器ipv6地址显示“scope global dadfailed tentative noprefixroute”无法连通的问题处理一例

服务器规模启用ipv6地址后,遇到一起案例 ,配置的服务ipv6地址显示“scope global dadfailed tentative noprefixroute”,无法连通,现将解决过程记录如下。 一、问题情况 1、ipv6信息检查 某台服务器配置ipv6地址后&#xff0c…

性能优化一条龙

性能优化 根据实际情况做性能优化的流程和分析。 性能优化的话,可以从很多方面,ui优化,组件优化,打包体积优化,页面优化等,但我们要监控这个页面哪些指标需要优化,比如FP,FCP&#x…

vue实现页面之间的el-select同步数据选项

demo案例&#xff1a; 父组件的el-select发生改变&#xff0c;子组件的el-select也可以发生改变 子组件的el-select发生改变&#xff0c;父组件的el-select也可以发生改变 核心就是给el-select组件的v-modle值互传 Index父组件页面 <template lang""><d…

Spark RDD惰性计算的自主优化

原创/朱季谦 RDD&#xff08;弹性分布式数据集&#xff09;中的数据就如final定义一般&#xff0c;只可读而无法修改&#xff0c;若要对RDD进行转换或操作&#xff0c;那就需要创建一个新的RDD来保存结果。故而就需要用到转换和行动的算子。 Spark运行是惰性的&#xff0c;在…

【Python】Python仓储管理系统(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

uni-app 微信小程序之好看的ui登录页面(二)

文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面&#xff08;一&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;二&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;三&#xff09; uni-app 微信小程…

vivado时序方法检查6

TIMING-19 &#xff1a; ODDR 上的生成时钟波形反相 生成时钟 <clock_name> 的波形与传入时钟 <clock_name> 的波形相比呈反相。 描述 前向时钟端口上的生成时钟应定义为与传入时钟相关。 DRC 警告报告称 &#xff0c; 通过对比传入源时钟发现 &#xff0…

【Android Audio Focus 音频焦点】

介绍 Android 中的音频焦点&#xff08;Audio Focus&#xff09;是一种机制&#xff0c;用于管理应用程序之间的音频资源竞争。当多个应用程序同时请求使用音频设备时&#xff0c;通过音频焦点机制可以确保最终用户的体验不受影响。 两个或两个以上的 Android 应用可同时向同…

go的两大测试方法- 官网推荐

go的两大测试方法- 官网推荐 go的两大测试方法- 官网推荐常见的不正规测试方法main方法个例测试验证 - 不正规1. 提供一个函数&#xff1a;Reverse(input string)进行测试2. 直接在函数下创建main函数下进行个例测试3. 测试发现&#xff0c;Reverse方法不支持某些汉字&#xff…

【SQL开发实战技巧】系列(四十九):Oracle12C常用新特性☞表分区部分索引(Partial Indexes)

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…

树莓派学习:socket获取客户端IP地址

定义 int s_fd;//服务器套接字描述符int c_fd;//客户端套接字描述符int clensizeof(struct sockaddr_in);//地址结构体的大小struct sockaddr_in s_addr;//服务端socket地址结构体memset(&s_addr,0,clen);struct sockaddr_in c_addr;//客户端socket地址结构体memset(&c…

数据分析基础之《matplotlib(4)—柱状图》

一、柱状图绘制 1、柱状图要素 有类别 2、需求&#xff1a;对比每部电影的票房收入 电影数据如下图所示&#xff1a; 3、matplotlib.pyplot.bar(x, height, width0.8, bottomNone, *, aligncenter, dataNone, **kwargs) 说明&#xff1a; x&#xff1a;有几个类别 height&am…

玩转Sass:掌握数据类型!

当我们在进行前端开发的时候&#xff0c;有时候需要使用一些不同的数据类型来处理样式&#xff0c;Sass 提供的这些数据类型可以帮助我们更高效地进行样式开发&#xff0c;本篇文章将为您详细介绍 Sass 中的数据类型。 布尔类型 在 Sass 中&#xff0c;布尔数据类型可以表示逻…

十一.图像处理与光学之图像缩放方式

十一.图像处理与光学之图像缩放方式(sensor binning模式/ skipping 模式/SOC resize) 文章目录 十一.图像处理与光学之图像缩放方式(sensor binning模式/ skipping 模式/SOC resize)11.1 sensor binning模式11.1.1 2:2 Binning模式11.1.2 Binning用途---**在环境光照低的情况下…

生信数据分析高效Python代码

1. Pandas glob获取指定目录下的文件列表 import pandas as pd import globdata_dir "/public/data/" # 获取文件后缀为.txt的文件列表 df_all pd.concat([pd.read_csv(f, sep\t) for f in glob.glob(data_dir *.txt)]) print(df_all)2. 使用 enumerate 函数获取…

基于Spring Boot和微信小程序开发的点餐系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot和微信小程序开发的点餐…

每日一练:插入排序

1. 概念及原理 插入排序是一种简单直观的排序算法&#xff0c;其基本思想是将一个元素插入到已经排序好的部分&#xff0c;然后不断地重复这个过程&#xff0c;直到整个数组有序。下面是插入排序的算法原理&#xff1a; 初始状态&#xff1a; 数组被分为已排序和未排序两个部分…

GORM 自定义数据类型json-切片(数组)

文章目录 自定义数据类型自定义json结构体定义Scaner和Valuer接口的实现插入数据&查询数据 自定义切片存储切片json形式存储字符串存储 创建&查询数据 gorm官方文档&#xff1a;自定义数据类型 自定义数据类型 数据空中很多情况下数据是多变的&#xff0c;我们这篇文章…

Qt::UniqueConnection和lambda一块用无效

如果槽函数是lambda。 那么用了Qt::UniqueConnection也会出现槽函数被多次调用的问题。 原因&#xff1a; 参考官方文档&#xff1a; QObject Class | Qt Core 5.15.16https://doc.qt.io/qt-5/qobject.html#connect