【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁


前言 锁我想不需要我过多的去说 , 大家都知道是怎么一回事了吧?
在多线程环境下 , 由于上下文的切换 , 数据可能出现不一致的情况或者数据被污染 , 我们需要保证数据安全 , 所以想到了加锁 。
所谓的加锁机制呢 , 就是当一个线程访问该类的某个数据时 , 进行保护 , 其他线程不能进行访问 , 直到该线程读取完 , 其他线程才可使用 。
还记得我之前说过Redis在分布式的情况下 , 需要对存在并发竞争的数据进行加锁 , 老公们十分费解 , Redis是单线程的嘛?为啥还要加锁呢?
看来老公们还是年轻啊 , 你说的不需要加锁的情况是这样的:
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

单个服务去访问Redis的时候 , 确实因为Redis本身单线程的原因是不用考虑线程安全的 , 但是 , 现在有哪个公司还是单机的呀?肯定都是分布式集群了嘛 。
老公们你看下这样的场景是不是就有问题了:
你们经常不是说秒杀嘛 , 拿到库存判断 , 那老婆告诉你分布式情况就是会出问题的 。
【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁
本文插图

我们为了减少DB的压力 , 把库存预热到了KV , 现在KV的库存是1 。

  1. 服务A去Redis查询到库存发现是1 , 那说明我能抢到这个商品对不对 , 那我就准备减一了 , 但是还没减 。
  2. 同时服务B也去拿发现也是1 , 那我也抢到了呀 , 那我也减 。
  3. C同理 。
  4. 等所有的服务都判断完了 , 你发现诶 , 怎么变成-2了 , 超卖了呀 , 这下完了 。
老公们是不是发现问题了 , 这就需要分布式锁的介入了 , 我会分三个章节去分别介绍分布式锁的三种实现方式(Zookeeper , Redis , MySQL) , 说出他们的优缺点 , 以及一般大厂的实践场景 。
正文一个骚里骚气的面试官啥也没拿的就走了进来 , 你一看 , 这不是你老婆嘛 , 你正准备叫他的时候 , 发现他一脸严肃 , 死鬼还装严肃 , 肯定会给我放水的吧 。
B站搜:三太子敖丙
咳咳 , 我们啥也不说了 , 开始今天的面试吧 。
正常线程进程同步的机制有哪些?
  • 互斥:互斥的机制 , 保证同一时间只有一个线程可以操作共享资源 synchronized , Lock等 。
  • 临界值:让多线程串行话去访问资源
  • 事件通知:通过事件的通知去保证大家都有序访问共享资源
  • 信号量:多个任务同时访问 , 同时限制数量 , 比如发令枪CDL , Semaphore等
那分布式锁你了解过有哪些么?
分布式锁实现主要以Zookeeper(以下简称zk)、Redis、MySQL这三种为主 。
那先跟我聊一下zk吧 , 你能说一下他常见的使用场景么?
他主要的应用场景有以下几个:
  • 服务注册与订阅(共用节点)
  • 分布式通知(监听znode)
  • 服务命名(znode特性)
  • 数据订阅、发布(watcher)
  • 分布式锁(临时节点)
zk是啥?
他是个数据库 , 文件存储系统 , 并且有监听通知机制(观察者模式)
存文件系统 , 他存了什么?
节点
【【Redis】阿里面试官让我用Zk(Zookeeper)实现分布式锁】zk的节点类型有4大类
  • 持久化节点(zk断开节点还在)
  • 持久化顺序编号目录节点
  • 临时目录节点(客户端断开后节点就删除了)
  • 临时目录编号目录节点
节点名称都是唯一的 。
节点怎么创建?
我特么 , 这样问的么?可是我面试只看了分布式锁 , 我得好好想想!!!
还好我之前在自己的服务器搭建了一个zk的集群 , 我刚好跟大家回忆一波 。


推荐阅读