当前位置: 首页 > 后端技术 > Java

面试官:Zookeeper是如何解决读写不一致,重写,共享锁的实现原理的?

时间:2023-04-01 17:30:16 Java

您好!大家好,我是小七,不靠谱的程序员小七打算在轻松幽默的对话中分享一些技术。如果你觉得通过小七的文章有所收获,那就给小七点个赞吧。文章持续更新中1、前言今天是清明假期,北京玉渊潭公园的樱花盛开。女朋友非要拉着我去看樱花。我在第一天晚上一直写到3:30。很想睡觉,可是没办法,军令状很难违背。来到这里,就像来到了花的海洋,让我体内的艺术菌开始躁动起来。忍不住吟出一首诗“樱花尽落鸦啼,闻龙过五溪。君至夜郎西”,啊,好美的樱花啊。这时,旁边的护林员满脸疑惑地看着我,问我,小伙子,你是不是背错了诗,不应该是子规的哭声吗?我只能尴尬地笑笑说,今天时机成熟的话我自己改。..就在我尽情地炫耀自己的艺术萌芽时,手机突然响了起来。我一看是北京号码,电话尾号是6543,就接通了。我说:你好,对方:你好,请问是小七吗?我:对了,阁下是什么?对方:我在某公司工作。我在某招聘网站上看到了你的简历。你还在找工作吗?我:是的,我还在找。对方:你现在方便采访吗?这时候,我看了看家里的领导,领导一脸嫌弃的说,让你陪我出去逛逛公园吧,刮风下雨,咱们见面吧。2.面试我:面试官你好,我现在面试方便。面试官:好的,我看你的简历说你精通zookeeper吧?我:我不敢接,因为我的同龄人爱我,我很惭愧(其实我的心已经膨胀了)。3.读写不一致和重写面试官:好的,那么并发条件下读写不一致和重写呢?我:读写不一致的问题是在并发的情况下,多个线程同时读写同一个数据,最终导致读写不一致。比如这里我的线程A查询缓存是空的,那么我要查询数据库,查询数据库的名字是张三,然后我要把缓存名改成张三。但是此时,线程A在查询数据库之后,更新缓存之前,线程B将数据库的数据名修改为李四,但是缓存名仍然是张三,所以数据库和缓存不一致。采访者:嗯,那两篇文章的不一致是怎么回事?双写不一致是指两个线程都在写操作,结果就是数据库和缓存不一致。比如线程B在线程A写入数据之后,更新缓存之前修改了数据,但是线程A最后修改了缓存,所以此时数据库和缓存是不一致的。面试官:嗯,怎么解决呢?我:用共享锁解决。4、Zookeeper共享锁的实现原理面试官:那么zookeeper是如何实现共享锁的,它的实现原理是什么?我:这个说起来有点复杂。要不我先跟闺蜜去公园玩,晚上回去再说。面试官:得了吧,你现在已经引起我的兴趣了,马上聊完,就跟我聊聊吧:嗯,zookeeper共享锁的实现原理是,如果相邻的线程都是读请求,那么共享同一个锁。这里我们可以看到线程1、2、3是连续的三个读请求操作,所以它们共享同一个锁A,即三个线程可以并发读取数据。然后我们看到线程4是一个写请求,所以他只能在前面所有的线程都执行完之后,才能执行自己的写操作。这里线程5也是一个写请求,所以他只能等前面的所有线程都执行完后,才能执行自己的写操作。那么线程6、7、8都是读线程,所以他们获取了同一个锁。线程5执行完后,线程6、7、8就可以一起进行读操作了。这里的监控,我们之前说过,就是为了解决羊群问题。采访者:年轻人,你真了不起。我在这里没有什么要问的。你有任何问题问我吗?我:嗯。..我们公司加班比较严重。采访者:你怎么看出来的?你没去过公司,你怎么知道?我:因为是假期,你还在约面试,可以想见公司的加班文化很浓。面试官:嗯,我们公司不提倡加班,但是员工喜欢加班。我:嗯。..那我还是考虑两天吧,我觉得我可能有点不合群。..采访者:那如果你不来,你能推荐一些其他的学生吗?我:那你还是好好学习一下zookeeper的原理吧,不然再推荐一些小七有趣的编程系列的忠实读者,你肯定会吃不消。面试官:那我也赶紧把小七的趣味编程系列看完,然后就见识见识了。我:嗯。..那样的话,两人都处于巅峰状态,谁也虐不过对方,就有点尴尬了。..五、总结zookeeper这里就不整理了,后面会继续更新文章,推荐收藏。文中涉及的命令必须像我一样多敲几次。只有在敲打的过程中,才能发现自己是否真正掌握了命令。如果觉得我的文章还不错,请点个赞。本文参与SegmentFault思维随笔《如何“反杀”面试官?如果您正在阅读,欢迎您加入。