redis分布式锁

加锁

 /**
  * 
  * @param conn
  * @param lockName 所名称
  * @param acquireTimeout 重试时间
  * @param lockTimeout 过期时间
  * @return
  */
public String acquireLockWithTimeout(
        Jedis conn, String lockName, long acquireTimeout, long lockTimeout)
    {
        String identifier = UUID.randomUUID().toString();
        String lockKey = "lock:" + lockName;
        int lockExpire = (int)(lockTimeout / 1000);
		
        long end = System.currentTimeMillis() + acquireTimeout;
        //重试时间范围内不断获取锁,直到获取锁或者时间到
        while (System.currentTimeMillis() < end) {
        	//setnx能添加进去说明当前锁没有被获取
            if (conn.setnx(lockKey, identifier) == 1){
            	//设置过期时间
                conn.expire(lockKey, lockExpire);
                return identifier;
            }
            //如果客户端在setnx和expire之间崩溃,那么此时这把没有过期时间
            if (conn.ttl(lockKey) == -1) {
            	//如果所没有过期时间,则新获取锁的客户端先设置此锁的过期时间,等过期时间到了在竞争
                conn.expire(lockKey, lockExpire);
            }

            try {
                Thread.sleep(1);
            }catch(InterruptedException ie){
                Thread.currentThread().interrupt();
            }
        }

        // null indicates that the lock was not acquired
        return null;
    }

释放锁

public boolean releaseLock(Jedis conn, String lockName, String identifier) {
        String lockKey = "lock:" + lockName;

        while (true){
            conn.watch(lockKey);
            if (identifier.equals(conn.get(lockKey))){
                Transaction trans = conn.multi();
                trans.del(lockKey);
                List<Object> results = trans.exec();
                if (results == null){
                    continue;
                }
                return true;
            }

            conn.unwatch();
            break;
        }

        return false;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值