看起来貌似没毛病,实际上上述代码有个致命的问题:
当某个线程拿到锁之后,如果系统崩溃了,那么锁永远都不会被释放.因此,我们应该给锁加一个过期时间,当时间到了,还没有被主动释放,我们就让redis释放掉它...所以,在设置锁的时候,redis的value值不能像上面代码那样,随便给个1,而应该给一个随机值,代表当前线程.
var id = Guid.NewGuid().ToString("N");
//获取锁...('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";//释放锁的redis脚本
redisClient.Del...redisClient.Eval(releaseLockScript, lockKey, id);
});
这篇文章只介绍了单节点Redis的分布式锁,因为单节点,所以不是高可用....多节点Redis则需要用官方介绍的RedLock,这玩意有点绕,我需要捋一捋.