redis 分布式锁 另一种实现
/** * deadLine 失效时间,比如当前时间+10s */ public boolean lock(String lock,long deadLine) { Boolean key = false; try { key = jimClient.setNX(lock, String.valueOf(deadLine)); if(!key){ String preValue = jimClient.get(lock); if(preValue!=null){ long preDeadLine = Long.parseLong(preValue); //如果当前时间大于上次的设置的失效时间,则上次的没有释放,或者上次的机器宕机,所有机器重新获取锁,getset的作用突显出来 if (preDeadLine < System.currentTimeMillis()){ String oldKey = jimClient.getSet(lock, String.valueOf(deadLine)); if(oldKey!=null && Long.parseLong(oldKey) == preDeadLine) { key = true; }else{ jimClient.set(lock,oldKey); } } } } }catch (Exception e){ e.printStackTrace(); } return key; } public void release(String lock,long deadLine){ try { if(StringUtils.isNotBlank(jimClient.get(lock)) && Long.parseLong(jimClient.get(lock)) == deadLine){ jimClient.del(lock); } }catch (Exception e){ e.printStackTrace(); } }
下一篇:
谷粒学苑第二章前端框架-2.1登录功能