Redis分布式锁中的问题
使用 使用 set key value ex 5 nx 命令设置key value 5秒过期 不存在才能设置成功,成功代表获取了分布式锁 随机值 在set时,key为固定,但value对不同线程应不同,如使用线程名。 如果使用的value相同会有什么问题?我们假设固定为 key=lock_key,value=lock_value 假设线程1获取到了分布式锁,超时30秒,但线程1的实际执行实际达到了40秒,在第30秒的时候锁被自动释放,线程2拿到了锁,线程2在继续自己的任务,假设是30秒。十秒后线程1结束,释放了锁,但这时候释放的是线程2设置的锁,从而导致同步出错。 若每个线程对应的value是不同的,在释放锁时只有value相同才会释放。但这个判断删除操作不是原子性的,可以使用lua脚本方式实现 if redis . call ( 'get' , KEYS [ 1 ] ) == ARGV [ 1 ] then return redis . call ( 'del' , KEYS [ 1 ] ) else return 0 end 锁超时 如上面所说的,如果获取锁设置了30秒超时,但实际任务执行时间超过了30秒怎么办? 可以使用守护线程的方式,在第29秒时给key续命10秒,然后十秒后守护线程继续执行。 主线程执行结束守护线程也会跟随销毁 单机故障引发并发问题 对于主从同步的情况