redis分布式锁的一些学习

最胖的瘦子 发布于 03/17 08:54
阅读 146
收藏 2

redis的分布式事务锁

首先,单台jvm在抢同一个业务,类似秒杀时,可以用锁机制来锁住线程。这里常用悲观锁解决

但是当多台jvm同时在抢一个业务时,这里就要用到reids分布式事务锁,,redisclient在set时候,要给线程指定一个超时时间set(key,value,outtime,nx),这里需要讲一下,set是在redis的2.8以后出现的,之前是依靠setnx和expire来设置,但是这样的问题是由于难以解决原子性问题。所以在2.8出现set操作以保持原子性,底层是依靠libiary,极其复杂,不太懂。同时开启守护线程,帮助jvm1在极端情况下出现原有时间内未执行完线程,导致线程被其他jvm抢去并被误删,进行一个expire续命操作,延长锁的时间。。。同时,在进行redis的key值删除操作时,多判断一步,当前的这个key是否是该进程创建,只有创建了key的进程才能拥有删除她的权限(这路现在用一个更好的办法吧,lua脚本来释放锁。主要是线程a已经通过了判断是否这个锁是它的,然后准备del的时候,突然发生了a线程过期了,b线程抢到了,然后一个del,误删出现了。。而使用lua脚本,由于他是一条命令,能执行完毕后,再执行redis的后续操作,保证一致性。。lua脚本里把key1赋值key,argv1赋值value)。。。如果线程始终在执行,并且守护线程一直在续命,可以给线程设置一个超时时间,一个线程正常完成业务30秒,那整个线程的超时时间可以设定为3分钟

加载中
返回顶部
顶部