java基础之----redi分布式锁
最近项目中,用到了redis分布式锁,使用过程有些心得,所以希望分享给大家。
首先我们意识里要知道分布锁有哪些?
在传统单体应用单机部署的情况下,并发问题可以通过使用Java并发相关的锁如synchronized,但是当规模上升到分布式集群的情况下,要控制共享资源访问,就需要通过分布式锁来实现。
当应用进行了分布式部署,应用有多个服务,这个时候应用服务端就没有一个可提供原子性操作的地方了,Redis性能高,且是单线程,因此可提供一个原子性操作的地方
分布式锁一般分三种,基于数据库的乐观锁,基于redis的分布式锁,基于zookeper的分布式锁。本文只讲基于reids的分布式锁。
为什么要用分布式锁?
传统项目很多都是单机的,基本上用不上分布式锁,但是当多机情况下,可能会引起不可控的并发问题。那么要解决这种情况,其实就需要用到分布式锁了。可以帮我们解决并发问题。
redis分布式锁的底层原理?
Redis分布式锁可以有多种方式实现但是其核心就是通过以下三个Redis命令组合实现。
-
SETNX SETNX key val 当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
-
Expire expire key timeout 为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
-
Delete delete key 删除key
核心思想
-
使用setnx获取锁。如果成功取到锁,则使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁。
-
获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。