关于redis-Redisson 锁的手记

≡放荡痞女 提交于 2019-12-18 22:33:47

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

后期出, springboot2 整合redis-此次仅记录redis的坑;

代码: 测试锁的自动释放与延迟间隔

public void t0() throws InterruptedException {
    String key = "seckill-order-submit-lock-1";
    int i= 0;
    while(true){
        i++;
        System.out.println(i+"--------------------------,每一次的执行都说明获取锁失败");
        Boolean flag = RedisLockUtil.tryLock(key,3,2);
        if(flag){
            System.out.println(i+"执行业务逻辑----------------");
            System.out.println("获取锁成功, 但故意不释放, 后面的人是否可以获得锁");
            Thread.sleep(6000);
        }
    }
}

 

 

package org.linlinjava.litemall.db.util;

/**
 * @Description:
 * @Auther: wuxw
 * @Date: 2019/12/18 18:10
 */

import org.linlinjava.litemall.db.service.DistributedLocker;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;

/**
 * redis分布式锁帮助类
 * @author yangzhilong
 *
 */
@Component
public class RedisLockUtil {


    @Autowired
    private DistributedLocker locker;

    private static DistributedLocker distributedLocker;


    @PostConstruct
    private void init() {
        distributedLocker = locker;
    }

    /**
     * 加锁
     * @param lockKey
     * @return
     */
    public static RLock lock(String lockKey) {
        return distributedLocker.lock(lockKey);
    }

    /**
     * 释放锁
     * @param lockKey
     */
    public static void unlock(String lockKey) {
        distributedLocker.unlock(lockKey);
    }

    /**
     * 释放锁
     * @param lock
     */
    public static void unlock(RLock lock) {
        distributedLocker.unlock(lock);
    }

    /**
     * 带超时的锁
     * @param lockKey
     * @param timeout 超时时间(上锁后自动释放锁时间)   单位:秒
     */
    public static RLock lock(String lockKey, int timeout) {
        return distributedLocker.lock(lockKey, timeout);
    }

    /**
     * 带超时的锁
     * @param lockKey
     * @param unit 时间单位
     * @param timeout 超时时间(上锁后自动释放锁时间)
     */
    public static RLock lock(String lockKey, int timeout, TimeUnit unit ) {
        return distributedLocker.lock(lockKey, unit, timeout);
    }

    /**
     * 尝试获取锁
     * @param lockKey
     * @param waitTime 最多等待时间
     * @param leaseTime 上锁后自动释放锁时间
     * @return
     */
    public static boolean tryLock(String lockKey, int waitTime, int leaseTime) {
        return distributedLocker.tryLock(lockKey, TimeUnit.SECONDS, waitTime, leaseTime);
    }

    /**
     * 尝试获取锁
     * @param lockKey
     * @param unit 时间单位
     * @param waitTime 最多等待时间
     * @param leaseTime 上锁后自动释放锁时间
     * @return
     */
    public static boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
        return distributedLocker.tryLock(lockKey, unit, waitTime, leaseTime);
    }
}

 

redis lock的几个方法

/**
 * 加锁
 * @param lockKey
 * @return
 */
public static RLock lock(String lockKey) {
    return distributedLocker.lock(lockKey);
}

一旦获取, 永不释放, 不手动调用unlock ,则永远不释放

/**
 * 带超时的锁
 * @param lockKey
 * @param timeout 超时时间(锁的持续生存时间)   单位:秒
 */
public static RLock lock(String lockKey, int timeout) {
    return distributedLocker.lock(lockKey, timeout);
}

一旦获取, 永不释放, 不手动调用unlock ,则永远不释放; 虽然设置了时间, 但你没有获取到也是很难受啊 一直等待获取;卡死, 容易死锁

/**
 * 尝试获取锁
 * @param lockKey
 * @param waitTime 最多等待时间
 * @param leaseTime 上锁后自动释放锁时间
 * @return
 */
public static boolean tryLock(String lockKey, int waitTime, int leaseTime) {
    return distributedLocker.tryLock(lockKey, TimeUnit.SECONDS, waitTime, leaseTime);
}

尝试, 尝了waitTime 后, 心灰意冷, 不等了, 就是这么任性;,继续执行后续代码

 

千万要谨记: 获取,锁失败, 可别主动去unlock

更多观看:

https://blog.csdn.net/qq_42105629/article/details/102589319 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!