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

郑州网站南京网站建设上海企业信用信息公示系统(上海)

郑州网站南京网站建设,上海企业信用信息公示系统(上海),西安网站建设哪个好,少儿编程机构十大排名点击上方“蓝字”带你去看小星星菜菜哥#xff0c;复联四上映了#xff0c;要不要一起去看看#xff1f;又想骗我电影票#xff0c;对不对#xff1f;呵呵#xff0c;想去看了叫我呀看来你工作不饱和呀哪有#xff0c;这两天我刚基于redis写了一个分布式锁#xff0c;很… 点击上方“蓝字”带你去看小星星菜菜哥复联四上映了要不要一起去看看又想骗我电影票对不对呵呵想去看了叫我呀看来你工作不饱和呀哪有这两天我刚基于redis写了一个分布式锁很简单不管你基于什么做分布式锁你觉得很简单吗来来来在计算机世界里对于锁大家并不陌生在现代所有的语言中几乎都提供了语言级别锁的实现为什么我们的程序有时候会这么依赖锁呢这个问题还是要从计算机的发展说起随着计算机硬件的不断升级多核cpu多线程多通道等技术把计算机的计算速度大幅度提升原来同一时间只能执行一条cpu指令的时代已经过去。随着多条cpu指令可以并行执行的原因原来不曾出现的资源竞争随着出现在程序中的体现就是随处可见的多线程环境。比如要更新数据库的一个信息如果没有并发控制多个线程同时操作的话就会出现互相覆盖的现象发生。锁要解决的就是资源竞争的问题也就是要把执行的指令顺序化01为什么需要分布式锁随着互联网的兴起现代软件发生了翻天覆地的变化以前单机的程序已经支撑不了现代的业务。无论是在抗压还是在高可用等方面都需要多台计算机协同工作来解决问题。现代的互联网系统都是分布式部署的分布式部署确实能带来性能和效率上的提升但为此我们就需要多解决一个分布式环境下数据一致性的问题。当某个资源在多系统之间共享的时候为了保证大家访问这个资源数据是一致的那么就必须要求在同一时刻只能被一个客户端处理不能并发的执行否则就会出现同一时刻有人写有人读大家访问到的数据就不一致了。在分布式系统的时代传统线程之间的锁机制就没作用了系统会有多份并且部署在不同的机器上这些资源已经不是在线程之间共享了而是属于进程服务器之间共享的资源。因此为了解决这个问题我们就必须引入「分布式锁」。分布式锁是指在分布式的部署环境下通过锁机制来让多客户端互斥的对共享资源进行访问。分布式锁的特点如下1互斥性和我们本地锁一样互斥性是最基本但是分布式锁需要保证在不同节点的不同线程的互斥。2可重入性同一个节点上的同一个线程如果获取了锁之后那么也可以再次获取这个锁。3锁超时和本地锁一样支持锁超时防止死锁。4高效高可用加锁和解锁需要高效同时也需要保证高可用防止分布式锁失效可以增加降级。5支持阻塞和非阻塞和 ReentrantLock 一样支持 lock 和 trylock 以及 tryLock(long timeOut)。02基于redis分布式锁如果你通过网络搜索分布式锁最多的就是基于redis的了。基于redis的分布式锁得益于redis的单线程执行机制单线程在执行上就保证了指令的顺序化所以很大程度上降低了开发人员的思考设计成本。但是基于redis做分布式锁难道真的这么容易吗1原子操作基于redis的分布式锁常用命令是SETNX key value只在键 key 不存在的情况下将键 key的值设置为value 。若键key 已经存在 则SETNX 命令不做任何动作。SETNX 是『SET if Not eXists』(如果不存在则 SET)的简写。代码示例redis SETNX redislock redislock    # redislock 设置成功(integer) 1redis SETNX redislock redislock2   # 尝试覆盖 redislock 失败(integer) 0redis GET redislock                   # 没有被覆盖redislock        成功获取到锁之后然后设置一个过期时间(这里避免了客户端down掉锁得不到释放的问题)redis expire redislock 5成功拿到锁的客户端顺利进行自己的业务业务代码执行完然后再删除该keyredis DEL redislock如果一切都想想象的那么顺利程序员TMD就不用996了。假如客户端拿到锁之后执行设置超时指令之前down掉了现实总是那么悲剧那这个锁就永远都释放不了.也许你会想到用 Redis 事务来解决。但是这里不行因为 expire 是依赖于 setnx 的执行结果的如果 setnx 没抢到锁expire 是不应该执行的。事务里没有 if-else 分支逻辑事务的特点是一口气执行要么全部执行要么一个都不执行。公司几个亿的业务又被你耽误了...        以上情况的出现是因为两个命令并非一个原子性操作所以在redis 2.8 版本之后出现了新的命令SETEX key seconds value所以现在可以利用一条原子性操作的命令来获取锁redis SETEX redislock 60 redislockOKredis GET redislock  # 值redislockredis TTL redislock  # 剩余生存时间(integer) 492超时问题在正常的业务当中当一个线程获取到锁并且设置了锁的过期时间之后会出现由于业务代码执行时间过长锁由于到达超时时间自动释放的情况。自动释放之后其他的线程就会获取到分布式锁导致业务代码不会串行执行。如果业务上允许这样的情况偶尔发生那程序员就开干吧最后顶多人工干预一下update 一下数据库。为了避免这类情况发生在使用redis分布式锁的时候业务方应尽量避免长时间执行的代码任务。        如果设置锁的超时时间比较长在一定程度上可以缓解业务代码执行时间长锁自动到期的问题但是一旦业务代码down掉其他等待锁的线程等待的时间会比较长这种情况下确保获取到锁的程序不会down 成为了主要问题。3获取锁失败当锁被一个调用方获取之后其他调用方在获取锁失败之后是继续轮询还是直接业务失败呢如果是继续轮询的话同步情况下当前线程会一直处于阻塞状态所以这里轮询的情况还是建议使用异步。4可重入性可重入性是指已经拥有锁的客户端再次请求加锁如果锁支持同一个客户端重复加锁那么这个锁就是可重入的。如果基于redis的分布式锁要想支持可重入性需要客户端封装可以使用threadlocal存储持有锁的信息。这个封装过程会增加代码的复杂度所以菜菜不推荐这样做。5redis挂了如果在多个客户端获取锁的过程中redis 挂了怎么办呢假如一个客户端已经获取到了锁这个时候redis挂了假如是redis集群其他的redis服务器会接着提供服务这个时候其他客户端可以在新的服务器上获取到锁了这也导致了锁意义的丢失。有兴趣的同学可以去看看RedLock这种方案以牺牲性能的代价解决了这个问题。6时钟跳跃问题在某些时候redis的服务器时间发生的跳跃由于锁的过期时间依赖于服务器时间所以也会出现两个客户端同时获取到锁的情况发生。当把以上问题都有解决方案了之后基于redis的分布式锁才可以放心使用基于redis设计简单分布式锁容易但是设计完美分布式锁不易 还觉得基于redis的分布式锁好做吗●程序员修神之路--问世间异步为何物●程序员修神之路--提高网站的吞吐量?●程序员修神之路--?分布式高并发下Actor模型如此优秀?●程序员过关斩将--论商品促销代码的优雅性●程序员过关斩将--请不要随便修改基类●程序员过关斩将--你的面向接口编程一定对吗●程序员修神之路--高并发下为什么更喜欢进程内缓存●程序员修神之路--高并发优雅的做限流架构师之路菜菜与君一起成长长按识别二维码关注
http://www.huolong8.cn/news/308331/

相关文章:

  • 网站模板 茶叶响应式怎么样制作自己的网站
  • 大连网站开发平台天辰建设网官网
  • seo网站推广优化公司公司做个网站好还是做公众号好
  • 海口自助建站网站建设价格差异
  • 企业网站改造优化seo服务端渲染
  • wordpress建站vip全站教程制作开发app需要多少钱
  • 网站的类型有哪几种如何做网站展示商品
  • 哪家做网站的公司好嫦娥直播
  • 个人网站备案名称举例网页升级紧急通知记好
  • 网站页面设计软件长春网站制作软件
  • 用jsp实现网站开发的流程中铁建设集团门户网登录不上去
  • 东莞凤岗网站建设制作电商网站建设需要哪些技术
  • 给人家做网站服务器自己搭吗设计公司的名字
  • 网站建设报告 商业价值深圳乐从网站建设
  • 西安集团网站建设南宁本地网
  • 网站开发美工总结临县网站建设
  • 开发网站做图文水印逻辑如何在网站上做网盘
  • 北京网站设计培训网站带做收录排名
  • php网站开发业务网站空间换了 使用原有域名
  • 用小米路由器做网站网站管理助手 二级域名
  • 深圳 福田 网站建设网站及app开发
  • 手机网页设计尺寸规范五种关键词优化工具
  • 天津大型网站建设报价公司企业年检网上申报
  • 三 网站建设新昌县城乡建设局网站
  • 网站设计的公司皆选奇点网络长春seo排名优化
  • 教学方面网站建设wordpress免登录发文章
  • 如何建立公司网站电话高端建站模版
  • 网站设计要点国外电子政务j建设与我国电子政务网站建设对比
  • 建站网站建设哪个好企业主题wordpress 含演示数据
  • 什么叫子网站wordpress角色