Login
网站首页 > 文章中心 > 其它

redis的分布式锁工具LockUtil_分布式锁redis实现方式

作者:小编 更新时间:2023-09-01 13:07:34 浏览量:461人看过

redis的分布式锁工具LockUtil_分布式锁redis实现方式-图1

/**
 * 基于redis的分布式锁工具
 * 
 * @author yuyufeng
 *
 */
public class LockUtil {
 
// 获取redis
static JedisPool jedisPool;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(100);
config.setMaxIdle(5);
config.setMaxWaitMillis(1000);
config.setTestOnBorrow(false);
 
// 构造池
jedisPool = new JedisPool(config, "12⑦0.0.1", 6379, 1000, "12345");
}
 
// redis键值前缀标识
private final static String PREFIX = "LOCK-FLAG-";
// 默认获取锁的等待时间
private final static Integer WAITTIME = 200;
 
/**
 * 获取锁
 * 
 * @param uid:锁的唯一标识
 * @param expire:锁自动释放时间
 * @return true:获得锁;false:锁已被占用
 */
public static Boolean getLock(String uid, Integer expire) {
if (expire < 0) {
    }
Long beginTime = System.currentTimeMillis();
do {
Jedis jedis = jedisPool.getResource();

//防止程序出错设置键值不失效
if(jedis.ttl(PREFIX + uid) == -1){
jedis.expire(PREFIX + uid, expire);
}

Long res = jedis.incr(PREFIX + uid);



if (res == 1) {
jedis.expire(PREFIX + uid, expire);
 
if (jedis != null) {
try {
jedis.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
 
return true;
}
 
if (jedis != null) {
try {
jedis.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
 
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(".");
} while ((System.currentTimeMillis() - beginTime) < WAITTIME);
 
return false;
}
 
/**
 * 获取锁
 * 
 * @param uid:锁的唯一标识
 * @param expire:锁自动释放时间
 * @param timeout:超时等待时间
 * @return true:获得锁;false:锁已被占用
 */
public static Boolean getLock(String uid, Integer expire, Integer timeout) {
if (expire < 0) {
    }
Long beginTime = System.currentTimeMillis();
do {
Jedis jedis = jedisPool.getResource();

//防止程序出错设置键值不失效
if(jedis.ttl(PREFIX + uid) == -1){
jedis.expire(PREFIX + uid, expire);
}

Long res = jedis.incr(PREFIX + uid);



if (res == 1) {
jedis.expire(PREFIX + uid, expire);
 
if (jedis != null) {
try {
jedis.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
 
return true;
}
 
if (jedis != null) {
try {
jedis.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
 
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(".");
} while ((System.currentTimeMillis() - beginTime) < timeout);
 
return false;
}
 
/**
 * 手动释放锁
 * 
 * @param uid:锁的唯一标识
 */
public static void returnLock(String uid) {
Jedis jedis = jedisPool.getResource();
jedis.del(PREFIX + uid);
if (jedis != null) {
try {
jedis.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
System.out.println("手动释放锁:" + uid);
}
 
}

/**
 * 测试
 * 
 * @param args
 */
public static void main(String[] args) {
 
AtomicInteger ai = new AtomicInteger(1);
AtomicInteger count = new AtomicInteger(0);
for (int i = 0; i < 30; i++) {
new Thread() {
@Override
public void run() {
String uid = "a" + ai.incrementAndGet() % 10; // 获取锁,并设置10秒失效
Boolean lock = LockUtil.getLock(uid, 10);
System.out.println(uid + "取锁结果:" + lock);
if (lock) {
// dosomething..
 count.incrementAndGet();
}
System.out.println("当前获取锁的数量:"+count);
}
}.start();
}
 
// 手动解锁测试,超时测试
//Boolean lock = LockUtil.getLock("testReturnKey", 1);
//System.out.println("testReturnKey" + "取锁结果:" + lock);
// LockUtil.returnLock("testReturnKey");
 
}

以上就是土嘎嘎小编为大家整理的redis的分布式锁工具LockUtil相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章