Redis实现分布式锁

1.什么是分布式锁?

        分布式锁即就是运用在分布式系统中的锁,在单体项目中,我们常使用synchronized和Reentrantlock来对多个线程访问共享资源来进行控制,而在分布式的项目中,请求会访问多个服务访问共享资源的问题由线程上升到了进程的级别,所以此时java中的锁就不起作用了,所以就要使用分布式锁。

2.使用SETNX命令实现分布式锁

         其实现的原理就是在Redis中定义一个键值对,把他可以看做是锁,就算是分布式系统,多个请求来到了不同的服务,当需要操作数据时需要先在redis中设置锁,如果发现此锁已经存在,则需要等待,等到实际占用此锁的线程执行完,直接delete删除此键值对即可。如下示例:

Redis实现分布式锁_第1张图片

        但是上面会出现问题,比如说正在占用锁的线程出现了异常或者进程服务直接挂掉,则此锁一直释放不掉,就会出现问题,解决措施就是可以将删除锁的代码放到finally代码块中,以及设置一个锁的失效时间,如下示例:

Redis实现分布式锁_第2张图片

         因为设置了失效时间,此时又会出现一个问题,有线程1和线程2,线程1先拿到锁,设置失效时间为10s,但是线程1需要执行15s,此时线程1还未执行完,锁就失效了,线程2就可以拿到锁,之后设置锁的失效时间为10s,线程2也在执行,但此时线程1执行完毕,线程1的finally中删除了redis中线程2设置的锁,就会出现问题,解决方法就是设置锁时,将锁和这个线程绑定起来,设置一个版本号,删除锁时需要判断版本号。

Redis实现分布式锁_第3张图片

 2.使用redission实现分布式锁

2.1实现方式

1.导入依赖


       org.redisson
       redisson
       3.6.5

2.创建Redisson对象

Redis实现分布式锁_第4张图片

 3.使用示例

Redis实现分布式锁_第5张图片

redission解决了setnx中的锁过期以及释放掉他人锁的问题,内部的机制是默认加锁30s,获取到锁的线程会有一个定时任务,每过10s会去扫描一下看该锁是否释放,如果没有释放,则会延长时间至30s,确保在线程执行的过程中锁不会过期。没有获取到锁的线程,会采用自旋的方式不断的尝试去获取锁。

你可能感兴趣的:(Redis,redis,分布式,数据库)