import org.apache.log4j.Logger; import com.sf.weplay.redis.RedisManager; public class Lock { //默认最长锁5分钟 private final static int EXPIRED_TIME = 300000; public static Logger logger = Logger.getLogger(Lock.class); /** * 锁 * @param lockName * @return true 成功/false 失败 */ public static boolean lock(String lockName) { return getLock(lockName, 0); } /** * 解除锁 * @param lockName * @return */ public static void unlock(String lockName) { RedisManager.redisManager.del(lockName); } private static boolean getLock(String lockName, Integer count) { long lockExpireTime = System.currentTimeMillis() + EXPIRED_TIME; String stringOfLockExpireTime = String.valueOf(lockExpireTime); boolean gotLock = false; if(count > 300) { return gotLock; } Long i = RedisManager.redisManager.setnx(lockName, stringOfLockExpireTime); if (i == 1) { gotLock = true; return gotLock; } String value = RedisManager.redisManager.get(lockName, String.class); if (value != null && isTimeExpired(value)){ value = RedisManager.redisManager.getSet(lockName, stringOfLockExpireTime); if (value != null && isTimeExpired(value)) { gotLock = true; return gotLock; } } try { Thread.sleep(200); } catch (InterruptedException e) { // 不处理异常睡眠异常 } return getLock(lockName, ++count); } private static boolean isTimeExpired(String value) { return Long.parseLong(value) < System.currentTimeMillis(); } }
JAVA redis实现分布式锁工具类
猜你喜欢
转载自wddpwzzhao123.iteye.com/blog/2351592
今日推荐
周排行