范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Redis怎么实现分布式锁

  阿粉最近迷上了 Redis,为什么呢?感觉 Redis 确实功能很强大呀,一个基于内存的系统 Key-Value 存储的数据库,竟然有这么多的功能,而阿粉也要实实在在地把 Redis 来弄一下,毕竟面试的时候,Redis 可以说是一个非常不错的加分项。  分布式锁
  为什么需要分布式锁?
  目前很多的大型项目全部都是基于分布式的,而分布式场景中的数据一致性问题一直是一个不可忽视的问题,大家知道关于分布式的 CAP 理论么?
  CAP 理论就是说任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。
  而我们的系统最终满足的永远都是最终一致性,而这种最终一致性,有些时候有人会喜欢问关于分布式事务,而有些人则偏重在分布式锁上。  分布式锁的种类数据库实现分布式锁  缓存实现分布式锁  Zookeeper实现分布式锁
  但是阿粉选择的就是使用缓存来实现分布式锁,也就是我们在项目中最经常使用的 Redis ,谈到 Redis,那真是可以用在太多地方了,比如说:  会话缓存  消息队列  分布式锁  发布,订阅消息  商品列表,评论列表
  我们今天就来实现用 Redis 来实现分布式锁,并且要学会怎么使用。  准备工作
  1.准备使用 Jedis 的 jar 包,在项目中导入 jar 包。        redis.clients     jedis     2.9.0  直接来写个工具类吧  public class RedisPoolUtil {      private static final String LOCK_SUCCESS = "OK";     private static final String SET_IF_NOT_EXIST = "NX";     private static final String SET_WITH_EXPIRE_TIME = "PX";      private RedisPoolUtil(){}     /**      *       * @param jedis       * @param lockKey 加锁      * @param requestId 请求的标志位      * @param expireTime 超时时间      * @return      */     public static boolean tryGetDistributedLock(Jedis jedis,String lockKey, String requestId, int expireTime) {          String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);          if (LOCK_SUCCESS.equals(result)) {             return true;         }else{             try{                 Thread.sleep(10);//休眠100毫秒             }catch(Exception e){                 e.printStackTrace();             }         }         return false;     } }
  jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);  这个加锁的姿势才是我们最需要了解的,不然你用的时候都不知道怎么使用。
  key:加锁的键,实际上就是相当于一个唯一的标志位,不同的业务,你可以使用不同的标志位进行加锁。
  requestId:这个东西实际上就是用来标识他是哪一个请求进行的加锁,因为在分布式锁中,我们要知道一件事,就是加锁的和解锁的,必须是同一个客户端才可以。
  而且还有一种比较经典的就是 B 把 A 的锁给释放了,导致释放混乱,如果你不加相同的请求,A 线程处理业务,执行了加锁,锁的过期时间是5s, B线程尝试获取锁,如果 A 处理业务时间超过5s,这时候 A 就要开始释放锁,而B在这时候没有检测到这个锁,从而进行了加锁,这时候加锁的时候,A还没处理完对应业务,当他处理完了之后,再释放锁的话,要是就是直接把 B 刚加的锁释放了,要么就是压根都没办法释放锁。
  SET_IF_NOT_EXIST:看字面意思,如果 key 不存在,我们进行Set操作,如果存在,啥都不干,也就不在进行加锁。
  SET_WITH_EXPIRE_TIME:是否过期
  expireTime:这是给 key 设置一个过期的时间,万一你这业务一直被锁着了,然后之后的业务想加锁,你直接给一直持有这个这个锁,不进行过期之后的释放,那岂不是要凉了。
  上面的方法中  tryGetDistributedLock  这个方法也就是我们通常使用的加锁的方法。 解锁 public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {          String script = "if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end";         Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));          if ("OK".equals(result)) {             return true;         }         return false;      }
  大家看到这个  script 的时候,会感觉有点奇怪,实际上他就是一个 Lua 的脚本,而 Lua 脚本的意思也比较简单。 先获取锁对应的value值,检查是否与requestId相等  如果相等则删除锁(解锁)  执行eval()方法
  其实这时候就有些人说,直接 del 删除不行么?你试试你如果这么写的话,你们的领导会不会把你的腿给你打断。
  这种不先判断锁的拥有者而直接解锁的方式,会导致任何客户端都可以随时进行解锁,也就是说,这锁就算不是我加的,我都能开,这怎么能行呢?
  在这里给大家放一段使用的代码,比较简单,但是可以直接用到你们的项目当中  try{ Boolean result = RedisPoolUtil.tryGetDistributedLock(jedis, "xxxxx", uuid, 5000);  if(result) {         xxxx代码片段 }else{  }  }catch(){  }finally{ RedisPoolUtil.releaseDistributedLock(jedis,"xxxxx", uuid); }  分布式锁的要求满足互斥性。也就是说不管在什么时候,只有一个客户端能够持有锁,不能是多个客户端。  不能出现死锁。就是说,如果要实现分布式锁,不能说当一个锁没有释放的时候,其他的客户端不能进行加锁,要保证不影响其他的客户端加锁。  加锁和解锁必须是同一个客户端  分布式的CAP理论
  我们先把这个实现方式实现了,然后我们再来说说大家最不愿意看的理论知识,毕竟这理论知识是你面试的时候经常会被问到的。
  分布式CAP理论:
  加州大学伯克利分校的 Eric Brewer 教授在 ACM PODC 会议上提出 CAP 猜想。2年后,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP。之后,CAP 理论正式成为分布式计算领域的公认定理。
  也就是说,在二十年前的时候,CAP 理论只是个猜想。结果两年之后被证实了,于是,大家在考虑分布式的时候,就有根据来想了,不再是空想了。
  什么是分布式的 CAP 理论 ?
  一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项
  这个和(Atomicity)不太一样,因为之前看有些人说,在 CAP 理论中的 A 和数据库事务中的 A 是一样的,单词都不一样,那能一样么?
  Availability :分布式中的 A 表示的是可用性,也就是说服务一直可用,而且是正常响应时间。
  而你在搭建分布式系统的时候,要保证每个节点都是稳定的,不然你的可用性就没有得到相对应的保证,也谈不上是什么分布式了。只能称之为一个伪分布式。
  Consistency: 一致性
  也就是说你的更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,这个如果你在使用 Redis 做数据展示的时候,很多面试官都会问你,那你们是怎么保证数据库和缓存的一致性的呢?
  毕竟你只是读取的话,没什么问题,但是设计到更新的时候,不管是先写数据库,再删除缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。
  所以如果你对这个很感兴趣,可以研究一下,比如说:  延时双删策略  懒加载 懒加载可采取双删+TTL失效来实现  主动加载
  如果你能在面试的时候把这些都给面试官说清楚,至少感觉你应该能达到你自己的工资要求。
  Partition tolerance:分区容错性
  分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
  其实在 CAP 理论当中,我们是没有办法同时满足一致性、可用性和分区容错性这三个特性,所以有所取舍就可以了。
  关于使用 Redis 分布式锁,大家学会了么?

实力即正义!7000万像素分辨率造就的人文镜头岩石星40mmF5。6岩石星40mmF5。6,一个擅长于人文故事的全能型镜头。它的颜值精致且典雅,有着高达7000万的像素分辨率,近乎于完美的畸变控制,它是简朴便携的摄影装备的代表之一。岩石星4mmF5从3499元跌至2999元,256GB5000万三摄,从高端市场跌至中端市场不出意料新一代的高通处理器还是存在了发烫的问题,自从知道骁龙8Gen1这颗高通新一代的旗舰处理器还是由三星代工之后,许多人就预感到它可能要翻车,因为上一代由三星代工的高通骁龙888荣耀X40售价定了,新增12512G大存储,首发价2899和其它品牌一样,现在荣耀也在把一些比较好的配置下沉到千元机上,比如荣耀X系列,这个系列搭载的续航影像和快充都比较主流了,但手机还是千元档起步,证明荣耀X系列的性价比也已经非常良心。成功入坑神机红米k50入手红米k50差不多一个星期了跟大家分享一下使用心得吧!首先,我是五一期间在实体店买的,8256的2500左右,那么大家要问了线上优惠这么高为什么选择线下呢?确实是这样某多多百万补预算不到2000,可以考虑一下这四款骁龙888处理器的手机motoedges30采用6。8英寸直边LCD屏配有魅影黑冰川蓝两种颜色高度约168。07毫米,宽度约75。53毫米,厚度约8。89毫米,重量约202克motoedges30搭载高小鹏汽车无声的疾驰小鹏P7高性能版长距离试驾体验文章开始之前你可能会觉得很奇怪小鹏P7?这不是一台已经上市一年多的老车了吗?还有啥新闻价值?的确,小鹏P7投产于2020年,在相当长的一段时间里,都是小鹏汽车支撑起自身品牌向上的唯盘点所有麒麟990的手机麒麟990手机汇总荣耀v30荣耀V30屏幕采用6。57英寸TFT材质(IPS技术)屏幕高度约162。7毫米,宽度约75。8毫米,厚度约8。9毫米,重量约213克。配有魅海星蓝幻夜星河冰岛幻境曙光之橙字节跳动成立抖音集团多只概念股封上涨停北京商报讯(记者马换换)受字节跳动成立抖音集团消息影响,5月9日多只字节概念股开盘大涨,早盘阶段天龙集团20CM涨停,岭南股份广博股份掌阅科技等多股涨停。交易行情显示,5月9日多只魅族5500mAh新机高调爆发,定名魅族19s,放弃高价策略今年国产手机品牌大部分都在争先恐后地发布4nm新机,但只有魅族比较冷清,直到现在已经是五月份,魅族还没有一款新机面世。难道魅族今年不发布新机了?当然不是这样!或许魅族是在酝酿大招,啧啧,小米这个瓜太大了印度政府执法局(ED)在社交平台上宣布根据1999年外汇管理法规定,扣押了小米在银行账户汇总的555。127亿卢比(约合人民币48亿元)。原因是小米非法向境外机构汇款。事发后,小米源杰科技答复科创板首轮17连问,对赌协议股权代持等被关注5月9日,资本邦了解到,陕西源杰半导体科技股份有限公司(下称源杰科技)回复科创板首轮问询。图片来源上交所官网在科创板首轮问询中,上交所主要关注源杰科技业务模式和市场竞争情况产品技术
刘强东成名不忘江苏父老,忍痛隐退保住兄弟们打下的江山2018年,明州事件彻底将刘强东拉下了神坛。这一年,刘强东被卷进了悉尼性侵案,也就是明州事件的总称。事情一经发酵,外界恨不得将刘强东打入十八层地狱。几乎是没有定论的情况,大众便将强Tata通信将为全球企业推出加强互联网WAN产品据Cnet网4月29日报道,全球数字生态系统推动者Tata通信的全资子公司Tata通信国际公司宣布为全球企业提供IZO互联网WAN的强化版新产品。图片来自CnetIZO互联网广域网一年倒闭3000家,死亡名单触目惊心,跨境为何如此艰难?这一年,跨境电商都过得不容易。从环球易购到JollyChic,从被封号亚马逊大卖到排名前十的电商公司墨灿倒闭,每个暴雷企业背后都有一群供应商遭殃,就像引发了一场集体踩踏式的崩盘。某LeetCode每日一题42。接雨水题目描述给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入height0,1,0,2,1,0,1,3,2,1,2,1输出6解释上面是由数使用PInvoke从Unity高效地与非托管代码对话在上一篇关于PINVOKE的文章中,我们学习了如何从Unity内部调用非托管方法,以及如何跨互操作屏障传递参数和返回值。现在让我们开始DllImport在我们的代码库中到处撒播以获马斯克收购推特,马云被起诉,南京天津杭州的土拍文章来自微信公众号记忆承载。欢迎关注阅读全文。三个问题,来自三波读者,我一次性回答了。第一个问题,马斯克收购推特,代价是440亿美元,计每股54。2美元。他宣布收购前的时候,推特的研究表明锻炼3秒钟也能提高肌肉力量新华社北京4月30日电参考消息29日刊登爱尔兰观察家报网站题为每天锻炼肌肉3秒钟能使你强壮得多的报道。报道摘要如下关于锻炼,我们所有人都喜欢听到的一个词是简短。如果一边是在健身房锻被华为甩在身后,靠卖掉研究楼保命,联手腾讯搞5G,它能活吗?华为,这是一个在中国电信行业中坚持并取得了不起成就的企业。超过爱立信成为全球电信第一,全球手机销量打败了苹果,拿下了5G时代的话语权。曾经是巨大中华四家国内电信行业大佬之一的华为,最省油宝马来了!330e正式发布百公里1。7L,华晨同步引进可挂绿牌现在的车企都很会看市场走势,这几年,汽车消费市场大刮新能源之风,自然引得众多厂家纷纷效仿,竞争者除了老牌厂家也不乏刚刚兴起的企业,一直在汽车销售市场占据有利地位的宝马自然也不会放过真正的快递王者几乎被多数人遗忘,如今营收4900亿远超顺丰!随着网络的高速发展,网购现金成为了社会的一道风景线与日俱增,相应而起的物流快递行业也是步入了一个辉煌的时代。说到快递,很多人都会想起来比较常见的顺丰京东亦或者三通一达,这些快递企业汽车中的小米,售价2万,配有倒车雷达,确定能上路?车妹说现如今汽车已经成了代步工具,但是随着汽车数量增加,停车也成为了一个难题,稍微大点的汽车,停车位都不好找,在这样的情况下,很多的企业就看中了小型车市场,比如我们知道的奔驰sma