redis的分布式锁工具LockUtil
/**
* 基于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, "127.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) {
return false;
}
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) {
return false;
}
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的更多相关文章
- java中redis的分布式锁工具类
使用方式 try { if(PublicLock.getLock(lockKey)){ //这里写代码逻辑,执行完后需要释放锁 PublicLock.freeLock(lockKey); } } ca ...
- redis实现分布式锁工具类 灰常好用
public interface RedisDistributionLock { /** * 加锁成功,返回加锁时间 * @param lockKey * @param threadName * @r ...
- redis实现分布式锁--工具类
1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- 基于redis的分布式锁实现
1.分布式锁介绍 在计算机系统中,锁作为一种控制并发的机制无处不在. 单机环境下,操作系统能够在进程或线程之间通过本地的锁来控制并发程序的行为.而在如今的大型复杂系统中,通常采用的是分布式架构提供服务 ...
- 基于redis的分布式锁的分析与实践
前言:在分布式环境中,我们经常使用锁来进行并发控制,锁可分为乐观锁和悲观锁,基于数据库版本戳的实现是乐观锁,基于redis或zookeeper的实现可认为是悲观锁了.乐观锁和悲观锁最根本的区别在于 ...
- 基于redis的分布式锁二种应用场景
“分布式锁”是用来解决分布式应用中“并发冲突”的一种常用手段,实现方式一般有基于zookeeper及基于redis二种.具体到业务场景中,我们要考虑二种情况: 一.抢不到锁的请求,允许丢弃(即:忽略) ...
- Redis的分布式锁
一.锁的作用 当多线程执行某一业务时(特别是对数据的更新.新增)等操作,可能就会出现多个线程对同一条数据进行修改.其最终的结果一定与你期望的结果“不太一样”,这就与需要一把锁来控制线程排排队了 - j ...
- 基于redis的分布式锁实现方案--redisson
实例代码地址,请前往:https://gitee.com/GuoqingLee/distributed-seckill redis官方文档地址,请前往:http://www.redis.cn/topi ...
- Redis除了做缓存--Redis做消息队列/Redis做分布式锁/Redis做接口限流
1.用Redis实现消息队列 用命令lpush入队,rpop出队 Long size = jedis.lpush("QueueName", message);//返回存放的数据条数 ...
随机推荐
- linux中root目录下下指定磁盘空间扩容
1 查看当前磁盘情况 fdisk -l /dev/sda1 2048 6143 2048 83 Linux /dev/sda2 * 6144 1054719 524288 83 Linux /dev/ ...
- 阿里云ecs,rds,redis优惠套餐
阿里云ECS优惠套餐 阿里云RDS优惠套餐 阿里云REDIS优惠套餐 阿里云REDIS集群版 阿里云短信资源包
- poj 2229 一道动态规划思维题
http://poj.org/problem?id=2229 先把题目连接发上.题目的意思就是: 把n拆分为2的幂相加的形式,问有多少种拆分方法. 看了大佬的完全背包代码很久都没懂,就照着网上的写了动 ...
- 三年工作经验,从小厂离职后,我凭什么拿到了阿里的offer
本篇文章主要记录分享我的面试准备过程. 很多朋友问我为什么离职 关于离职原因,马云有一句经典的话"要么钱没给到位,要么心委屈了",想必大家耳熟能详了,我这里再细说一下我个人离职原因 ...
- GPRS DTU设备常见的问题分析
在GPRS DTU设备使用的过程中,经常会遇到各种各样的问题,今天就为大家来分析一下在GPRS DTU设备使用时会遇到的一些问题. 1.GPRS模块设置 a.检查串口参数是否与GPRS模块的工作参数一 ...
- 20200725_java爬虫_项目创建及log4j配置
0. 摘要 0.1 添加log4j依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>sl ...
- Learn day7 继承(单、多、菱形)\多态\魔术方法\装饰器\异常
1.继承 1.1 单继承# ### 继承 """ (1) 单继承 (2) 多继承 至少2个类,子类和父类 一个类继承另外一个类,当前类是子类 (衍生类) 被继承的这个类是 ...
- 【译】Ringbahn的两个内存Bug
原文链接:https://without.boats/blog/two-memory-bugs-from-ringbahn/ 原文标题:Two Memory Bugs From Ringbahn 公众 ...
- 300万运算/秒 :VoltDB在电信行业基准测试上可线性扩展性能
01 总 体 概 述 VoltDB受到全球电信软件解决方案提供商的信赖,后者将其作为首选内存数据库来驱动他们部署在全球100多家运营商处的任务关键型应用.VoltDB受到青睐的原因在于其性能和功能不仅 ...
- 解决 ‘Could not fetch URL https://pypi.python.org’的问题
[前提]: win10下python3和python2共存环境,但是环境变量只配置了python3 [问题]: 用pip安装一个包执行pip2 install xxx的时候报错Fatal error ...