当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选面试题-分布式锁在项目上用过吗?

金三银四精选面试题-分布式锁在项目上用过吗?

来源:图灵教育
时间:2023-11-22 10:06:00
 

分布式锁在项目上用过吗?

分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程

分布式锁应该具备哪些条件:

  • 分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
  • 高可用的获取锁与释放锁
  • 高性能的获取锁与释放锁
  • 具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误)
  • 具备锁失效机制,即自动解锁,防止死锁
  • 具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败

在分布式场景中我们避免不了使用分布式锁对资源进行锁定,通常我们使用redis或者Zookeeper来实现。

这里说下redis,Redis我们知道执行命令是单线程的,我们可以通过lua脚本的方式提交命令,以保证原子性操作。虽说是能够实现加锁的基本功能,但是中间还是会遇到很多其他的问题,比如说锁超时如何释放问题,我们可以设置过期时间,那么setnx命令和expire命令并不是原子操作了,那就要使用lua脚本组合提交执行,那如果业务执行时间大于我们设置的过期时间,那就需要锁续期机制,这一切我们可以直接使用RedissonLock来帮我们完成。里面已经是封装的比较完善了。

那么我们在采用Redis作为分布式锁的时候我们会遇到一个高可用的问题,如果选择主从架构就可能会存在锁出问题的场景。虽说Redis也是提供了RedLock但是,它的使用成本会比较高,而且在理论层面还存在争议性。

看业务需求吧,如果能够接受极端场景下互斥失败问题,并且对性能要求比较高的时候我们可以采用RedissonLock,做好兜底方案就行。如果不能接受就直接用ZooKeeper吧!