红锁实现互斥的利器(redis锁用来干嘛的)

红锁是一把利器,它可以实现多线程编程中重要的互斥关系,其优点是可以跨越多个进程甚至多台服务器。

红锁的原理比较简单,它利用Redis的原子性特点,利用SETNX设定或者GETSET更新一个key。在操作期间如果这个key存在则会返回false,表示该key有人抢先占用,知道它的expire过期返回时才能被别人抢占到。

常见的红锁模式如下:

// 尝试获取锁,成功返回true,失败返回false
def tryLock(lockName, expireTime):
if redis.SETNX(lockName, "locked"):
redis.expire(lockName, expireTime)
return true
else
return false

// 释放锁,返回true/false
def releaseLock(lockName):
if redis.get(lockName) == "locked":
redis.del(lockName)
return true
else
return false

红锁虽然简单实用,但也有一定缺点。由于它采用心跳机制,如果最后一次update或set时节点挂掉,该key会一直存在,导致其他节点无法继续占用锁,也就无法完成同步。为了应对这一情况,一般会添加另一个随机key,只有当这两个key都存在时才算锁被占用。另外,红锁的性能有限,因为很多时候需要同步操作,比如:多台服务器上的锁都需要更新,会导致瓶颈。

红锁还是一项很有用的技术,它可以帮助我们实现多线程,多进程甚至多台服务器之间的互斥关系,然而也一定需要学会妥善使用它,来获得更好效果。


数据运维技术 » 红锁实现互斥的利器(redis锁用来干嘛的)