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

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 分布式锁,大家学会了么?

万能的头条大神,iphone11要不要升15。3?感谢您的阅读!一般来说,我不会建议大家升级到iOS15。3系统。我的iPhone12ProMax,这款手机升级到iOS15。3系统之后出现了一些问题。1。手机它的蓝牙以及4G,Wi上市公司数字人民币业务有序铺开分析指出提前布局的企业或许能吃到一波红利新快报讯记者涂波报道2月14日,广电运通在互动平台表示,公司将针对不同的应用场景和使用人群开发异形卡式可穿戴等多形态的数字人民币硬件钱包。近红米为什么率先发布RedmiK50电竞版,而不是整个系列同时发布?感谢邀请红米为什么率先发布RedmiK50电竞版,而不是整个系列同时发布?实际我觉得这个问题是有多个原因造成的,首先最直观的原因是OPPO早在之前就有官宣了首发天玑9000系列芯片2022年智能手机什么牌子好,性价比高?谢邀。你觉得性价比最高的牌子就是最好的牌子。我一直搞不懂什么叫性价比,我的消费观点一直很简单,我喜欢的用得着的也买得起的,我就买。花五块钱去买一样东西我觉得划得来,对我来讲就有性价天呐!全新达芬奇17。4。3升级版来了新增超多黑科技!剪辑神器本期慧慧为小伙伴们带来一款软件,号称可以挑战后期全流程,秒杀PRAEFCPXEDIUS等,并且自带视频磨皮瘦脸瘦身等等黑科技的技能点,已经成为视频创作者和摄影师必不可少的工具之一!你放对了吗?中国移动科普路由器如何摆放是不是总感觉家里的wifi信号不好?碰到这种情况,不妨给家中路由器换个姿势,说不定信号就会变强。其实有不少小伙伴买了性能不错的路由器,但由于摆放位置出了错,导致使用效果大打折扣。那iPhone14的消息预计iPhone14系列将会在今年9月份发布,让我们来了解一下。iPhone14系列共有4款机型,两款屏幕6。1英寸分别是iPhone14与iPhonePro,两款屏幕6。1英寸分华为发布新款5G旗舰,麒麟9000121TB,售价高达20999元经常关注华为手机的用户应该都知道,前段时间,华为已经开始把P50Pro的处理器换成骁龙888,同时去年12月份发布的折叠手机P50pocket也是使用的骁龙888处理器。对于花粉来老年人耳聋要不要配助听器?你好,关于老年人耳聋要不要配助听器的问题老年人由于器官衰老,神经营养不足,容易患老年性耳聋,就像一个电子产品,使用寿命长了,虽然可以运作,但性能不如以前。如果不戴助听器,听觉神经接小米手机质量太差了,杂音重音颤音怎么维权?感谢你把不好的都买走了,让我们用上好的小米手机有任何问题,先去客服检测,确实是有问题,有国家三包法可以遵循,要解决问题还是先检测在说,而不是在网上骂。实在检测机构不作为,还有123会过日子的90后过节都买了些啥做礼物引子时间过得好快,一不小心就2022年啦,小伙伴们2021年立下的Flag都实现了吗?又到了新的一年立Flag的时候,年终奖也都拿到手了吧,不管是给父母长辈准备礼物还是给自己一份新
苹果13or12s机模曝光图,苹果的操作一如既往距离苹果新iphone发布越来越近,果粉们的心一定是非常期待,但是苹果一如既往的熟练手法可能让果粉失望了。此前,从华强北流出了苹果13or12s的机模图片,已经出现在各大媒体平台。Windows11预览版不止有蓝屏,还会出现绿屏与黑屏死机也有护眼模式与夜间模式。Windows系统崩溃死机时出现蓝屏的机制,在英语里称作BSOD,即蓝屏死机BlueScreenOfDeath的缩写,是任何Windows用户避之不及的估值与市值全解析滴滴的资本市场教育课崔桂林文常言道,丑媳妇总要见公婆。其实,新娘子哪有不精心妆扮自己的?画眉深浅入时无可能更符合新娘待拜高堂时期待而又敏感不安的心情。滴滴当然不是丑媳妇,相反,作为有史以来中国互联网企低配高价手机多是有原因的!数据显示线下渠道是手机销售主力在首创具有超高性价比的互联网手机模式后,小米一举成为了全球的手机大厂,而就此互联网手机也开始了疯狂的发展,包括很多国产老牌厂商在内,几乎每家都有针对线下渠道的子品牌。当然了,虽然线亚马逊销量TOP10品牌TOZO产品怎么样?体验一款耳机看看近年来,我国跨境电商行业不断发展,市场规模持续扩大,2015年2020年年均增速明显。近期,由我爱音频网联合主办的2021中国跨境电商3C配件选品大会汇集了众多跨境电商企业,并达成最近有那么多真无线耳机新品选购时该关注什么?最近几个月,厂商推出了不少真无线耳机新品。我们在选购真无线耳机的时候,多了很多选择。真无线耳机虽然看着很简单,但实际上选购时还是有很多值得注意的地方。佩戴体验佩戴舒适度是选购一款真挂耳式耳机推荐,不需要入耳的蓝牙耳机不管是出去跑步,还是骑车,带不带耳机总是一个矛盾的事情。戴上耳机后耳塞会堵住耳朵,你将无法及时有效的接收外界的声音信息,这对于户外运动来说是非常危险的。但是在骨传导耳机出现之后,这无线耳机性价比之选HIKZ1S无线耳机入手体验作为一个运动爱好者,跑步时听音乐是我的习惯。作为一个数码产品的伪粉丝,我最近就入手了一款HIKZ1S无线耳机,从外观颜值到音质效果,都让我十分惊喜,具体表现如何呢,一起来体验一下吧暑期到,休闲来,给游戏加点料,升级电竞耳机力保游戏段位时间的数字不知不觉已经拨到下半年七月来到,正式宣告盛夏来临的同时,也是迎来毕业季。学生时代已经是十几年前,现在想来仍有一些唏嘘感叹想念那时候多彩的生活,还有无忧无虑的闲适自得。以前2000多的大内存手机值不值得买?值得,有时候别被价格唬住了,要仔细看配置。比如12G256GB的真我Q3Pro狂欢版。有拓展内存,最高7G,这运行速度就跟坐火箭一样。还有就是这256G的内存,这不是想下啥就下啥。第三代芯片材料!碳化硅能耗低性能强,中国或将实现国产替代经常关注科技圈的朋友们一定知道,芯片半导体是决定产品技术性能的关键。今年以来,全球芯片半导体极度紧缺,以至于很多行业,尤其是汽车手机智能家电等,都面临着缺货断货的艰难困境。如果芯片