Java代码 public class SoaLockSupport { private Logger logger = Logger.getLogger(SoaLockSupport.class); //你的redis实现类 private RedisAAA redis; // 超时时间 private long timeout = 3000; /** * 获得锁,如果没拿到,会在超时时间内一直等待 */ public boolean lock(final String key) { FutureTask<Boolean> future = new FutureTask<Boolean>(new Callable<Boolean>() { public Boolean call() { boolean nx = false; for (;;) { nx = setnx(key); if(nx){ break; } try { // 获取不到暂停2ms Thread.sleep(2); } catch (InterruptedException e) { // } } return nx; } }); try { return future.get(timeout, TimeUnit.MILLISECONDS); } catch (Exception e) { logger.error("try lock error,key = "+key, e); } return false; } /** * 尝试获得锁,如果没拿到,直接返回失败 */ public boolean trylock(String key) { if (setnx(key)) { return true; } // 做这一步是防止key一直不被Delete,导致锁一直得不到释放的问题 String oldTime = redis.getString(key); if (oldTime != null && !oldTime.equals("")) { long time = Long.valueOf(oldTime) + timeout; long now = System.currentTimeMillis(); if (time < now) { logger.info("time = "+time + ",and now="+now); redis.delete(key); return setnx(key); } } return false; } /** * 释放锁 */ public void unlock(String key) { redis.delete(key); } private boolean setnx(String key) { if (redis.setnx(key, System.currentTimeMillis() + "") == 1) { return true; } return false; }
正文
基于redis setnx命令的分布式锁
这篇文章最后更新于2161天前,您需要注意相关的内容是否还可用,如有疑问请联系作者!
文章版权声明:除非注明,否则均为红色火线自媒体博客原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...