如何删除锁
上⾯是创建锁,同样的具有有效时间,但是我们不能完全依赖这个有效时间,场景如:有效时间设置1分钟,本⾝⽤⼾A获取锁 后,没遇到什么特殊情况正常⽣成了抢购订单后,此时其他⽤⼾应该能正常下单了才对,但是由于有个1分钟后锁才能⾃动释 放,那其他⽤⼾在这1分钟⽆法正常下单(因为锁还是A⽤⼾的),因此我们需要A⽤⼾操作完后,主动去解锁:
public iinntt delnx(String key, String val) { Jedis jedis = null; try { jedis = jedisPool.getResource(); iiff (jedis == null) { rreettuurrnn 0; }//if redis.call('get','orderkey')'1111' then return redis.call('del','orderkey') else return 0 end StringBuilder sbScript = new StringBuilder(); sbScript.append("if redis.call('get','").append(key).append("')").append("'").append(val).append("'"). append(" then "). append(" return redis.call('del','").append(key).append("')"). append(" else "). append(" return 0"). append(" end"); rreettuurrnn Integer.valueOf(jedis.eval(sbScript.toString()).toString()); } catch (Exception ex) { } finally { iiff (jedis != null) { jedis.close(); } }rreettuurrnn 0; }
这⾥也使⽤了jedis⽅式,直接执⾏lua脚本:根据val判断其是否存在,如果存在就del;
其实个⼈认为通过jedis的get⽅式获取val后,然后再⽐较value是否是当前持有锁的⽤⼾,如果是那最后再删除,效果其实相 当;只不过直接通过eval执⾏脚本,这样避免多⼀次操作了redis⽽已,缩短了原⼦操作的间隔。(如有不同⻅解请留⾔探讨);同 样这⾥创建个get⽅式的api来测试:

浙公网安备 33010602011771号