分布式锁(1)
最近实现了一个后台增删改查功能,为了防止并发修改数据导致数据覆盖,想到了使用分布式锁,当多个用户同时修改同一条数据时,在第一个修改完之前,其他用户的修改都抛出异常,这样就能保证用户修改的一致性。
分布式锁的意义
线程或进程间的并发问题是不需要分布式锁的,在分布式系统中才需要,目的是控制多个进程对同一个资源的更新,使更新顺序化,最终保证资源状态更新的一致性。
我们知道锁的目的是使资源独占,防止并发更新出现覆盖的问题,对于db,本身具有事务的实现,我们可以使用乐观锁和悲观锁实现一致性,但对于没有事务的非DB类型的资源访问,分布式锁是解决并发更新的有力武器。
分布式锁的实现
-
实现分布式锁需要一个中心化的服务,常见的是用redis等分布式缓存来实现分布式锁,redis来实现分布式锁的原因一方面是性能够快,另一方面是本身支持的方法很适合来实现分布式锁。
!(https://ws2.sinaimg.cn/large/006tKfTcgy1g109r2yv6zj31w70u0gzg.jpg)
在这个设计中,使用了复杂工厂模式,模板方法,单例模式来达到复用的目的。
对外提供DistributedLock接口,包含lock(),tryLock(),unLock()三个方法,面向接口编程。
为了使性能最优,在锁定前优先使用了本地线程锁,达到可冲入和节省网络开销的目的。