setnx应该使用带时间戳的,Redis底层实现了原子性。
Redission的RLock是使用Lua脚本保证原子性。而且支持重入,第一次抢锁时建立一个Hash结构,key是锁的名称,Filed是抢到锁的进程中的线程名称,value是重入次数。而且不指定过期时间时,可以自动续期,默认30秒,10秒时重置为30秒,可以防止一开始实际执行时间超过过期时间,或者在用户量增加,数据量增加后执行时间变长,或者下游服务时间执行超时,或者中间件执行超时。而且,服务宕机后,Redis连接断开,会自动释放锁。
RedissonMultiLock可以用于多个锁加锁成功才成功。
在一主一从时,如果主加了锁,但复制到从节点前就断开连接,从节点成为主节点之后会感知不到加锁。
可以使用RedissonRedLock,是Redisson Redistribution Lock简称,这种锁会在多个节点加锁成功后才算成功,所以即使没有加锁的从节点成为主节点,也不会影响加锁结果判断。
记录一下Redisson分布式锁官方介绍,红锁那块介绍不对:
https://github.com/redisson/redisson/wiki/8.-%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%E5%92%8C%E5%90%8C%E6%AD%A5%E5%99%A8#84-%E7%BA%A2%E9%94%81redlock