当前位置: 首页 > news >正文

联科网站建设企业培训考试app

联科网站建设,企业培训考试app,网站备案信息查询,淘宝wordpress cms主题redis分布式锁故事背景什么是Redis分布式锁业务场景未加任何锁的代码单机情况下JVM级别加锁多服务部署总结提升故事背景 本篇文章是redis实战系列的第二篇文章。本章的主要内容是Redis分布式锁的相关知识。本篇文章将告诉你什么是分布式锁,结合一个业务场景&#x…

redis分布式锁

  • 故事背景
  • 什么是Redis分布式锁
  • 业务场景
    • 未加任何锁的代码
  • 单机情况下JVM级别加锁
  • 多服务部署
  • 总结提升

故事背景

本篇文章是redis实战系列的第二篇文章。本章的主要内容是Redis分布式锁的相关知识。本篇文章将告诉你什么是分布式锁,结合一个业务场景,先带大家看看,单机上是如何实现锁功能的。学完本篇,你可以了解到什么是锁,为什么要加锁。

什么是Redis分布式锁

Redis分布式锁是一种基于Redis实现的分布式锁机制,它可以保证在分布式环境中,同一时刻只有一个客户端能够获取到锁,从而避免了多个客户端同时对同一资源进行修改的问题。
在这里插入图片描述
接下来我将结合一个秒杀的例子讲述如果实现Redis的分布式锁。

业务场景

秒杀场景是一个非常经典的需要使用锁的场景。
假设有一个商品限时秒杀的业务场景,多个用户同时在秒杀开始时间内尝试购买该商品,但是该商品数量有限,只有一定数量的用户可以购买成功,其他用户则购买失败。
为了保证秒杀的公平性与真确性,这个时候我们就要通过来对商品的数量进行访问

未加任何锁的代码

结合上面的业务场景,我们来先来实现一个未加任何锁的代码,简单实现一下这个小需求:

  1. 首先在redis里添加了 key值为 stock value值 为 200 的数据,模拟我们要秒杀的商品数量为200
    在这里插入图片描述
    2.编写业务逻辑代码
@RestController
@RequestMapping("/test")
public class IndexController {// 自动注入 StringRedisTemplate 对象@Autowiredprivate StringRedisTemplate stringRedisTemplate;// 处理 HTTP GET 请求路径是 /test/lock@GetMapping("lock")public String deductStock() {// 获取当前库存String stock1 = stringRedisTemplate.opsForValue().get("stock");if( stock1 == null){System.out.println("秒杀未开始");return "end";}int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));if (stock > 0) {// 扣减库存int realStock = stock - 1;// 更新库存stringRedisTemplate.opsForValue().set("stock", realStock + "");System.out.println("扣减成功,剩余的库存为:" + realStock);} else {System.out.println("扣减失败,库存不足");}return "end";}}

上述是根据我们的业务进行的一个简单的实现,在这个实现里,未对代码进行加锁。这段代码将会出现很经典的超卖问题。我们来压测一下接口,看一下效果
3. 接口压测,模拟并发
在这里插入图片描述
在这里我们使用的ApiPost进行一键压测。让我们一起来看一下结果吧
在这里插入图片描述
我们发现,50个请求进来之后,如果是正常的情况下,是应该减少50个库存,每个请求获得1个商品。可以根据结果看,我们的50个请求获得了5个商品。同一个商品卖给了多个用户。列如 195号商品同时卖给了10个人。
那么我们该如何去解决这个问题呢?

单机情况下JVM级别加锁

首先我们来看一下,如果是单机(项目只部署在一台机器上),如何给我们的代码加锁,解决上述问题。
使用 synchronized 进行jvm级别加锁。

  1. 代码
synchronized (this){// 获取当前库存String stock1 = stringRedisTemplate.opsForValue().get("stock");if( stock1 == null){System.out.println("秒杀未开始");return "end";}int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));if (stock > 0) {// 扣减库存int realStock = stock - 1;// 更新库存stringRedisTemplate.opsForValue().set("stock", realStock + "");System.out.println("扣减成功,剩余的库存为:" + realStock);} else {System.out.println("扣减失败,库存不足");}}

代码非常的简单,使用 synchronized 关键字,将我们的业务逻辑进行包裹即可。
synchronized,保证同一时刻只有一个线程执行被synchronized修饰的代码块或方法,从而避免多个线程同时对共享资源进行修改而导致的数据不一致的问题。
2. 运行结果
在这里插入图片描述
从结果上来看,通过synchronized 可以在jvm级别上进行上锁。但是我们实际的生产环境中,很少有部署单机服务的。如果我们部署了多个服务,那么通过synchronized 是肯定无法影响另一条机器上的请求的。

多服务部署

在这里插入图片描述
假设我们,部署了两个服务,部署在tomcat1和tomcat2上,使用nginx做负载。此时仅仅通过synchronized 只能保持 tomcat1自己本身。tomcat2自己本身的数据被锁住。如果两个服务同时提供服务,仍然会产生我们上述的超卖问题。

总结提升

本文我们主要讲了锁的概念,为什么要加锁,单机上jvm级别的加锁,多服务部署的话,我们现在的代码存在的问题。接下来我会讲解如何解决我们这次遗留的问题,在分布式环境下,如何加锁,如何解决可能会存在的问题。
专栏地址

http://www.tj-hxxt.cn/news/87627.html

相关文章:

  • 深广纵横设计公司官网东莞seo优化公司
  • 北京网站开发哪家公司好重庆网站seo搜索引擎优化
  • 河北省企业网站建设公司网站模板平台资源
  • 陕西有没有做网站好的公司国家反诈中心app下载
  • 现在做个人网站推广普通话手抄报内容
  • 贵阳网站开发哪家好百度一下点击搜索
  • 南阳政府做网站推广吗网页推广怎么做
  • 网站建站建设联系电话it培训机构排名及学费
  • 衡东网站定制做网站用什么编程软件
  • 深圳网站建设服务商哪些好?上海网站快速排名优化
  • 制作网站好的公司优化大师好用吗
  • 在网站底部给网站地图做链接查询网站信息
  • 品牌网站建设优化公司排名北京seo公司工作
  • 长沙网站优化外包服务百度网站首页
  • 安阳市设计旺道seo优化软件怎么用
  • 做网站的空间百度代运营
  • 网天下网站建设短视频代运营方案模板
  • 电子商务网站的定义百度sem是什么
  • 做投票网站深圳网络推广公司哪家好
  • 无锡企业建设网站公司纯注册app拉新平台
  • 谈谈对网站开发的理解长沙关键词优化首选
  • 国外哪个网站可以做外贸比较好最全资源搜索引擎
  • wordpress限制ip登次数什么是seo关键词优化
  • 十大seo公司什么是seo推广
  • 江西合创建设工程有限公司 网站搜索引擎优化哪些方面
  • 沈阳妇科seo技术公司
  • 网站目标百度官方网站首页
  • 镇江网站建设制作梅州网络推广
  • 做预定网站的作用百度推广外推联系方式
  • 网站开发需要用到java吗长沙网站制作公司哪家好