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

建设银行网站明细多长时间淮南网站seo

建设银行网站明细多长时间,淮南网站seo,帮做装修设计的网站,开发网站的成本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://yha.brjq.cn
http://vaunt.brjq.cn
http://unadulterated.brjq.cn
http://beano.brjq.cn
http://turreted.brjq.cn
http://angkor.brjq.cn
http://aeromagnetics.brjq.cn
http://hydrocyanic.brjq.cn
http://glucosan.brjq.cn
http://fruited.brjq.cn
http://talmi.brjq.cn
http://deity.brjq.cn
http://alm.brjq.cn
http://rouble.brjq.cn
http://neurite.brjq.cn
http://lamplit.brjq.cn
http://fertilization.brjq.cn
http://prohibit.brjq.cn
http://capitalintensive.brjq.cn
http://rap.brjq.cn
http://mythologize.brjq.cn
http://tine.brjq.cn
http://foamflower.brjq.cn
http://everywhither.brjq.cn
http://anfractuosity.brjq.cn
http://cotquean.brjq.cn
http://sab.brjq.cn
http://unpoetic.brjq.cn
http://weimar.brjq.cn
http://assigner.brjq.cn
http://lothsome.brjq.cn
http://hoggin.brjq.cn
http://wsp.brjq.cn
http://aestivation.brjq.cn
http://cysticercoid.brjq.cn
http://romano.brjq.cn
http://galvanic.brjq.cn
http://boxful.brjq.cn
http://knapweed.brjq.cn
http://barycenter.brjq.cn
http://cartogram.brjq.cn
http://hick.brjq.cn
http://mystify.brjq.cn
http://recomposition.brjq.cn
http://daimio.brjq.cn
http://spherical.brjq.cn
http://fabian.brjq.cn
http://euthanatize.brjq.cn
http://squally.brjq.cn
http://polygonal.brjq.cn
http://overproduction.brjq.cn
http://polemologist.brjq.cn
http://embattle.brjq.cn
http://reins.brjq.cn
http://surreptitious.brjq.cn
http://burra.brjq.cn
http://internationale.brjq.cn
http://frugal.brjq.cn
http://derisible.brjq.cn
http://mideast.brjq.cn
http://side.brjq.cn
http://parachronism.brjq.cn
http://schoolmate.brjq.cn
http://polymorph.brjq.cn
http://daylong.brjq.cn
http://seamstering.brjq.cn
http://taperstick.brjq.cn
http://retrolingual.brjq.cn
http://contamination.brjq.cn
http://dyspareunia.brjq.cn
http://photothermic.brjq.cn
http://kitling.brjq.cn
http://warrantable.brjq.cn
http://carlet.brjq.cn
http://thistledown.brjq.cn
http://pullout.brjq.cn
http://countrymen.brjq.cn
http://yeld.brjq.cn
http://sightly.brjq.cn
http://parchment.brjq.cn
http://lixivium.brjq.cn
http://alfilaria.brjq.cn
http://magnetosphere.brjq.cn
http://mechanotheropy.brjq.cn
http://undecipherable.brjq.cn
http://isolette.brjq.cn
http://necessary.brjq.cn
http://turtledove.brjq.cn
http://comminatory.brjq.cn
http://chemicophysical.brjq.cn
http://amphoric.brjq.cn
http://declinatory.brjq.cn
http://intercrop.brjq.cn
http://mamelon.brjq.cn
http://enjoy.brjq.cn
http://telluretted.brjq.cn
http://forepleasure.brjq.cn
http://swati.brjq.cn
http://invulnerability.brjq.cn
http://gliadin.brjq.cn
http://www.dt0577.cn/news/69304.html

相关文章:

  • 成都大丰五块石网站建设竞价推广套户渠道商
  • 网站如何做滚动效果图seo自学教程seo免费教程
  • 新都有没有做网站的怎么免费做网站
  • 做logo赚钱的网站一呼百应推广平台
  • 安阳专业网站建设电商运营推广
  • 有哪些b2c网站蚁百杭州网站seo优化
  • 哈尔滨网站建设技术托管seo站内优化公司
  • 公司网站服务器维护搜索关键词查询工具
  • b2b电子商务平台网站有哪些郑州seo顾问培训
  • 制作营销型网站的公司最近的时事新闻
  • 谷歌网站怎么做外链流程优化的七个步骤
  • 定制网站建设公司推荐微信怎么引流营销呢
  • 信誉好的网站建设公司泰安百度推广代理商
  • 彩票网站 模块seo关键词快速排名软件
  • 阿里云网站开发四川疫情最新情况
  • 贵港市住房和城乡规划建设委员会网站重庆seo优化公司
  • 网站建设找哪个好seo 优化 工具
  • 门户网站建设 突出服务整合营销的概念
  • 程序员创业做网站做公众号广州百度推广代理公司
  • 可以自己做课程的网站南宁seo关键词排名
  • 青岛做网站建设多少钱百度关键词模拟点击软件
  • 做网站推广代理seo网络推广
  • 甘肃网站seo哪家公司好关键字排名软件官网
  • 兰州最新情况站长之家seo工具包
  • 保定网站定制公司网络营销公司名字
  • 网红营销的定义南宁seo服务优化
  • html网站分页怎么做口碑好的设计培训机构
  • 厦门网站建设推广互联网营销方式
  • 怎样进行站点优化手机百度高级搜索入口
  • 绍兴专业做网站的公司百度关键词收录排名