Redis应用之二分布式锁

一、前言

前一篇 Redis应用之一自增编号 我们主要介绍了使用INCR命令来生成不重复的编号,今天我们来了解Redis另外一个命令SET NX的用途,对于单体应用我们可以简单使用像synchronized这样的关键字来给代码块加锁,但对于分布式应用要实现锁机制就必须依赖于中间件,现在一般分布式锁主要依赖于Redis、Zookeeper或Google的Chubby来实现, 今天我们看一下如何用Redis的SETNX命令来实现分布式锁。

分布式锁定义:在分布式环境下,一个方法在同一时间只能被一台机器中的一个线程执行。

说明:我的文章目的是用最简单的语言和代码来说清楚一件事情,严谨性肯定是不够的,希望读者能注意辨析。

二、SETNX命令说明

SET key value NX PX

NX:表示key不存在时设置,如果key存在则返回NULL

PX:设置过期时间,单位毫秒

上面的set nx 返回OK表示拿到锁,如果返回nil表示拿锁失败,资源被其它线程占用。

三、模拟分布式环境并发扣减库存

在https://start.spring.io/快速创建Springboot工程框架,引入web和data-redis依赖。

1、使用Redis存储库存值

     set  inventory:9321785256118  1000

2、在代码中获取当前库存数然后进行扣减,最后又设置到Redis中去。

3、模拟请求

将代码部署到两台机器,然后用Jmeter创建两个线程组,分别对两台机器接口进行请求,每个请求只使用一个线程请求500次,执行结果 Redis中的库存值并不为0,而是大于0不确定的值(第一次结果348,第二次结果55),如果改成每个线程组的线程数为10个请求次数为50次,这时结果会更大一些。

这就是分布式环境多台机器并发的问题,多台机器从Redis中取出相同的值,然后分别再执行扣减库存操作,结果就会发生超卖的问题,线程数更多结果更大这是因为更多的请求从Redis中取出了相同的值,然后进行扣减库存

四、在代码中加入Redis分布式锁

然后同样用Jmeter发向两台机器发请求,当每台机器1个并发,库存数最后为0,当提高到每台机器10个并发,库存数为75,这段代码还是有一些问题的,我们下一次再讲如何优化以及如何使用Redisson解决分布式并发问题。

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

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

相关文章

【中间件篇-Redis缓存数据库07】Redis缓存使用问题及互联网运用

Redis缓存使用问题 数据一致性 只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。 我以 Tomcat 向 MySQL 中写入和删改数据为例,来给你解释一下,数据的增删改操作具体是如何进行的。 我…

CSS常用示例100+ 【目录】

目前已有文章 11 篇 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS相关…

arcgis--浮点型栅格数据转整型

利用【Spatial Analyst工具】-【数学】-【转为整型】工具,将浮点型数据转为整型。如下: 【转为整型】对话框参数设计如下: 转换结果如下:

做一个Sprngboot文件上传-阿里云

概述 这个模块是用来上传头像以及文章封面的,图片的值是一个地址字符串,一般存放在本地或阿里云服务中 1、本地文件上传 我们将文件保存在一个本地的文件夹下,由于可能两个人上传不同图片但是却同名的图片,那么就会一个人的图片就…

mysql之正则表达式匹配

题目: 今天在牛客网看到一道关于数据库正则表达式匹配的问题,发现自己一点不会做。 正则表达式: 一、正则表达式 MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中 符合要求的特殊字符串。MySQL 的…

C与汇编深入分析

汇编怎么调用C函数 直接调用 BL main传参数 在arm中有个ATPCS规则(ARM-THUMB procedure call standard)(ARM-Thumb过程调用标准)。 约定r0-r15寄存器的用途: r0-r3:调用者和被调用者之间传递参数r4-r11…

2023网络钓鱼状况报告:ChatGPT等工具致网络钓鱼电子邮件数量激增1265%

近日,SlashNext发布了《2023年网络钓鱼状况报告》,报告显示:自ChatGPT于2022年11月推出以来,网络钓鱼电子邮件数量激增1265%,这标志着网络犯罪依托于人工智能进入了一个新的时代。 该报告深入分析了2022年第四季度至2…

【第2章 Node.js基础】2.4 Node.js 全局对象(二) process 对象

process对象是一个全局对象,提供当前Node.js 进程信息并对其进行控制。通常用于编写本地命令行程序。 1.进程事件 process对象是EventEmitter类的实例,因此可以使用事件的方式来处理和监听process对象的各种事件。以下是一些常用的process对象事件&…

使用 Stable Diffusion Img2Img 生成、放大、模糊和增强

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D数字孪生场景编辑器 Stable Diffusion 2022.1 Img5Img 于 2 年发布,是一款革命性的深度学习模型,正在重新定义和推动照片级真实…

FD-Align论文阅读

FD-Align: Feature Discrimination Alignment for Fine-tuning Pre-Trained Models in Few-Shot Learning(NeurIPS 2023) 主要工作是针对微调的和之前的prompt tuining,adapter系列对比 Motivation: 通过模型对虚假关联性的鲁棒…

Adobe ME下载、Media Encoder下载

Media Encoder 2021 是一款可以帮助Adobepremiere pro和Adobe After Effects的用户使用集成视频编码器进行创作的视频和音频编码软件。Media Encoder 2021 mac新版本中针对上一个版本进行了多方面的改进与优化,提升了软件的性能与支持文件格式提升,有需要…

RabbitMQ 核心部分之简单模式和工作模式

文章目录 一、Hello World(简单)模式1.导入依赖2.消息生产者3.消息消费者 二、Work Queues(工作)模式1.抽取工具类2.启动两个工作线程3.启动一个发送线程4.结果 总结 一、Hello World(简单)模式 在下图中&…