redis 实现分布式锁 伪代码
lock(){if(jedis.setNx("key",timestamp)){ locktime = timestamp; //获得锁的时间 ..dosth . unlock(locktime)}else{ locktime = jedis.get(timestamp) if(locktime > timeout){ //锁时间超时 lasttime = jedis.getset("key",timestamp) if(lasttime > timeout){ //再次取出锁时间,若还是超时, 表示此期间没有其他竞争,getset已获取锁 locktime = timestamp; //获得锁的时间 ..dosth unlock(locktime) }else{ //再次取出锁, 若未超时,表示此期间有其他竞争已拿到锁,等待 wait(); lock(); } }else{ wait(); //未获得锁, 锁也未超时 , 等待一会再次尝试获取锁 lock() }}}unlock(locktime){ if(locktime > timeout){//超时 currentlocktime = jedis.get(key) //取出当前锁的时间 if(locktime != currentlocktime){ //两个时间不一样,证明期间有其他竞争拿到超时锁 , 什么也不干,不要动别人的东西 }else{//两个时间一样,超时锁没被抢走, 此时可能并没有那么大的并发 , 可以什么也不干 , 也可以del key } } else { //锁未超时 ,锁在我手 ,直接del del(key)}}