java代码实现redis分布式锁代码
2015-07-20 18:00
896 查看
import redis.clients.jedis.Jedis;
//java代码模拟处理redis分布式锁代码
public class redisTest {
private static long timeout = 1000;
public static void main(String[] args) throws Exception {
new Thread(new Runnable(){
@Override
public void run() {
long sid = 0;
try {
sid = getSetId("subThread");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("sid="+sid);
}}).start();
long mid=getSetId("mainThread");
System.out.println("mid="+mid);
}
public static long getSetId(String thread) throws Exception {
Long id = null;
while (true) {
boolean success = getLock("id_lock");
if (success) {
Jedis jedis = new Jedis("192.168.6.20", 6385);
jedis.auth("QvXtTZN4MyBDknj5");
String strId=jedis.get("id");
// 如果id为空说明未设置id值
if (strId==null||strId=="") {
id = 100000001l;
} else {
id=Long.valueOf(strId);
id = id + 1;
}
jedis.set("id", String.valueOf(id));
// 释放锁
releaseLock("id_lock");
break;
} else {
System.out.println("thread="+thread+",锁在使用中");
Thread.sleep(100);
}
}
return id;
}
public static boolean getLock(String lockKey) {
boolean success = false; // 默认获取锁失败
long value = System.currentTimeMillis() + timeout; // 设置锁值
// SETNX lockKey 成功
Jedis jedis = new Jedis("192.168.6.20", 6385);
jedis.auth("QvXtTZN4MyBDknj5");
long isExit = jedis.setnx(lockKey, String.valueOf(value));
// isExit=1 说明SETNX成功,成功获取一个锁
if (isExit == 1)
success = true;
// 否则 SETNX失败,说明锁仍然被其他对象保持,检查其是否已经超时
else {
long oldValue = Long.valueOf(jedis.get(lockKey));
// 锁已经超时
if (oldValue < System.currentTimeMillis()) {
String getValue = jedis.getSet(lockKey, String.valueOf(value));
// 获取锁成功
if (Long.valueOf(getValue) == oldValue)
success = true;
// 已被其他进程捷足先登了
else
success = false;
}
// 未超时,则直接返回失败
else
success = false;
}
return success;
}
// 释放锁
public static void releaseLock(String lockKey) {
Jedis jedis = new Jedis("192.168.6.20", 6385);
jedis.auth("QvXtTZN4MyBDknj5");
long current = System.currentTimeMillis();
// 避免删除非自己获取得到的锁
if (current < Long.valueOf(jedis.get(lockKey)))
jedis.del(lockKey);
}
}
//java代码模拟处理redis分布式锁代码
public class redisTest {
private static long timeout = 1000;
public static void main(String[] args) throws Exception {
new Thread(new Runnable(){
@Override
public void run() {
long sid = 0;
try {
sid = getSetId("subThread");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("sid="+sid);
}}).start();
long mid=getSetId("mainThread");
System.out.println("mid="+mid);
}
public static long getSetId(String thread) throws Exception {
Long id = null;
while (true) {
boolean success = getLock("id_lock");
if (success) {
Jedis jedis = new Jedis("192.168.6.20", 6385);
jedis.auth("QvXtTZN4MyBDknj5");
String strId=jedis.get("id");
// 如果id为空说明未设置id值
if (strId==null||strId=="") {
id = 100000001l;
} else {
id=Long.valueOf(strId);
id = id + 1;
}
jedis.set("id", String.valueOf(id));
// 释放锁
releaseLock("id_lock");
break;
} else {
System.out.println("thread="+thread+",锁在使用中");
Thread.sleep(100);
}
}
return id;
}
public static boolean getLock(String lockKey) {
boolean success = false; // 默认获取锁失败
long value = System.currentTimeMillis() + timeout; // 设置锁值
// SETNX lockKey 成功
Jedis jedis = new Jedis("192.168.6.20", 6385);
jedis.auth("QvXtTZN4MyBDknj5");
long isExit = jedis.setnx(lockKey, String.valueOf(value));
// isExit=1 说明SETNX成功,成功获取一个锁
if (isExit == 1)
success = true;
// 否则 SETNX失败,说明锁仍然被其他对象保持,检查其是否已经超时
else {
long oldValue = Long.valueOf(jedis.get(lockKey));
// 锁已经超时
if (oldValue < System.currentTimeMillis()) {
String getValue = jedis.getSet(lockKey, String.valueOf(value));
// 获取锁成功
if (Long.valueOf(getValue) == oldValue)
success = true;
// 已被其他进程捷足先登了
else
success = false;
}
// 未超时,则直接返回失败
else
success = false;
}
return success;
}
// 释放锁
public static void releaseLock(String lockKey) {
Jedis jedis = new Jedis("192.168.6.20", 6385);
jedis.auth("QvXtTZN4MyBDknj5");
long current = System.currentTimeMillis();
// 避免删除非自己获取得到的锁
if (current < Long.valueOf(jedis.get(lockKey)))
jedis.del(lockKey);
}
}
相关文章推荐
- redis slowlog
- Redis常用命令
- Python 模块-操作Redis
- redis存在大量脏页问题的追查记录
- Tomcat8+redis做session同步
- HashMap&&Redis Concurrent Problem
- RedisMM ---Redis监控管理系统
- redis-cluster研究和使用
- Redis总体介绍
- redis跟 java相关的操作
- redis的一些基本命令
- Redis的安装、使用以及php中扩展redis并实现php操作redis的一个例子
- Redis介绍及常用命令
- redis常用命令
- Redis系列(六)-SortedSets设计技巧
- linux 下安装redis以及php Redis扩展
- redis实战:redis限制某ip的恶意请求
- Redis 安装教程 (Windows 2.6.13 稳定版)
- java存储GBK编码数据到redis
- CentOS Linux下 redis 下载、安装、配置、主从集群配置