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

做效果图有哪些网站快速建站平台

做效果图有哪些网站,快速建站平台,个人博客网站的建设结构图,jsp如何进行购物网站开发分布式锁的实现有哪些? 1.Memcached分布式锁 利用Memcached的add命令。此命令是原子操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。 2.Reids分布式锁 和Memcached的方式类似,利用Redis的setn…

image

image

image

image

image

image

image

image

分布式锁的实现有哪些?

1.Memcached分布式锁

利用Memcached的add命令。此命令是原子操作,只有在key不存在的情况下,才能add成功,也就意味着线程得到了锁。

2.Reids分布式锁

和Memcached的方式类似,利用Redis的setnx命令。此命令同样是原子性操作,只有在key不存在的情况下,才能set成功。(setnx命令并不完善,有替代方案)

3.Zookeeper分布式锁

利用Zookeeper的顺序临时节点,来实现分布式锁和等待队列。Zookeeper设计的初衷,就是为了实现分布式锁服务的。

4.Chubby

Google公司实现的粗粒度分布式锁服务,底层利用了Paxos一致性算法。

如何用Redis实现分布式锁?(以Redis为例)

分布式锁实现的三个核心要素:

1.加锁

最简单的方法是使用setnx命令。key是锁的唯一标识,按业务来决定命名。比如想要给一种商品的秒杀活动加锁,可以给key命名为“lock_sale_商品ID”。而value设置成什么呢?我们先设置为1。加锁的伪代码如下:

setnx(key,1)

当一个线程执行setnx返回1,说明key原本不存在,该线程成功得到了锁;当一个线程执行setnx返回0,说明key已经存在,该线程抢锁失败。

2.解锁

有加锁就有解锁。当得到锁的线程执行完任务,需要释放锁,以便其他线程进入。释放锁的最简单方式是执行del指令,伪代码如下:

del(key)

释放锁之后,其他线程就可以继续执行setnx命令来获得锁。

3.锁超时

如果一个得到锁的线程在执行任务的过程中挂掉,来不及显式地释放锁,这块资源将会永远被锁住,别的线程再也别想进来。

所以,setnx的key必须设置一个超时时间,以保证即使没有被显式释放,这把锁也要在一定的时间后自动释放。setnx不支持超时参数,所以需要额外的指令,伪代码如下:

expire(key,30)

综上所述,实现分布式锁的伪代码如下:

if(setnx(key,1) == 1){expire(key,30)try{do something...}finally{del(key)}
}

但是…这样会有其他问题吗?

image

上面的伪代码存在三个致命的问题:

1.setnx和expire的非原子性

设想一个极端场景,当某线程执行setnx,成功得到了锁:
image

setnx刚执行成功,还未来得及执行expire指令,节点1Duang的一声挂掉了

image

这样一来,这把锁就没有设置过期时间,变得“长生不老”,别的线程再也无法获得锁了。

如何解决?setnx指令本身是不支持传入超时时间的,幸好Redis2.6.12以上版本为set指令增加了可选参数,伪代码如下:

set(key,1,30,NX)

这样就可以取代setnx指令

2.del导致误删

又一个极端场景,假如某线程成功得到了锁,并且设置的超时时间是30秒。

image

如果某些原因导致线程B执行的很慢很慢,过了30秒都没执行完,这时候锁过期自动释放,线程B得到了锁。

image

随后,线程A执行完了任务,线程A接着执行del指令来释放锁。但这时候线程B还没执行完,线程A实际上删除的是线程B加的锁

image

如何避免这种情况呢?可以在del释放锁之前做一个判断,验证当前的锁是不是自己加的锁。

具体的实现,可以在加锁的时候把当前线程ID当做value,并在删除之前验证key的value是不是自己线程的ID。

加锁:

String threadId = Thread.currentThread().getId()
set(key,threadId,30,NX)

解锁:

if(threadId.equals(redisClient.get(key))){del(key)
}

但是这样做又隐含了一个新的问题,判断和释放锁是两个独立操作,不是原子性

所以这块可以用Lua脚本来实现:

String luaScript = 'if redis.call('get',KEYS[1]) == ARGV[1] then returnredis.call('del',KEYS[1]) else return 0 end';redisClient.eval(luaScript,Collections.singletonList(key),Collections.singltonList(threadId));

这样一来,验证和删除过程就是原子操作了。

3.出现并发的可能性

第二点的场景中,虽然我们避免了线程A误删掉key的情况,但是同一时间有A、B两个线程在访问代码块,仍然不完美。

如何解决呢?我们可以让获得锁的线程开启一个守护线程用来给快过期的锁“续航”

image

当过去了29秒,线程A还没有执行完,这时候守护线程会执行expire指令,为这把锁“续命”20秒,守护线程从第29秒开始,每20秒执行一次。

image

当线程A执行完任务,会显式关掉守护线程。

image

另一种情况,如果节点1忽然断电,由于线程A和守护线程在同一个进程,守护线程也会停下。这把锁到了超时的时候,没人给它续命,也就自动释放了。

image

http://www.yayakq.cn/news/210824/

相关文章:

  • 北京公司网站制作公司网站建设平台有哪些 谢谢平台建站
  • 模块网站需要多少钱php网站导航
  • 住房建设部网站 保定物流网站建设流程图
  • 网站模版怎样使用ui设计师培训班
  • 漯河优惠网站建设价格网站 代备案
  • sae网站备案wordpress 六亩填
  • 常州哪些网站公司做的好处北京首都功能优化
  • 在线免费网站模板微营销推广软件
  • 深圳网站制作公司哪儿济南兴田德润优惠吗wordpress .suspected
  • 国内免费的建网站平台群晖外网访问wordpress时格式变完
  • 网站优秀网站地址网络推广培训心得
  • 自助网站制作互联网营销优势
  • 怎么查看自己网站有没有做301wordpress网站后缀HTML
  • 山西建设执业注册中心网站wordpress公众号菜单
  • wordpress建站教程pdf世界500强企业
  • 网站数据库怎么建立长沙网站推广排名
  • 承德建设厅网站提供秦皇岛网站建设
  • 平台网站建设方案模板建设银行东四十条支行支行网站
  • 网站添加文章之后更新缓存访问网站就需要输入账号密码温州做公众号和做网站的地方
  • 哪里可以做企业网站晋城推广型网站开发
  • 网站的关于我们页面百度域名注册与解析服务
  • 网站一级目录wordpress 弹框
  • 外围网站怎么做新网站如何做友情链接
  • 如何建设网址导航网站如何查询网站
  • 阜阳恒亮做网站多少钱新图闻提供的产品和服务
  • 企业营销型网站建设品牌做电商运营需要具备什么能力
  • 网站页面设计价格抖音做我女朋友好不好网站
  • 黄石有没有做网站的电信的网做的网站移动网打不开该找电信还是移动
  • 南宁建网站必荐云尚网络aso关键词覆盖优化
  • 网站制作学习引流推广的方法