Redis 分布式锁 (欢迎吐槽)

来源:互联网 发布:java判断是否有双引号 编辑:程序博客网 时间:2024/06/04 23:20
** * 采用分布式锁进行 * * */@Servicepublic class DistributedLock {    private final static Logger LOGGER = LoggerFactory.getLogger(DistributedLock.class);    public final static Long TIMEOUT=Const.DL_TIMEOUT;    @Resource    private DealWithByRedis dealWithByRedis;    /**     * 获取锁操作     *     * @return     */    public boolean getLock(String LOCK_KEY) {        boolean flag = false; // 默认没有获得锁/** * 循环获取值 */        while (!flag) {            flag = dealWithByRedis.setnx(                    LOCK_KEY,                    String.valueOf(System.currentTimeMillis()                            + TIMEOUT + 1));            if (flag) { // 已经获取了这个锁 然后跳出循环// flag = true;//LOGGER.info("********获取分布式锁********");                break;            }            String rtTimestamp = dealWithByRedis.get(LOCK_KEY);            if (rtTimestamp != null && !"".equals(rtTimestamp.trim())) { // 判断是否不为空// 从redis获取的时间戳                Long rtLongTimestamp = Long.valueOf(rtTimestamp);// 当前的时间戳                Long rtCurrentTimestamp = System.currentTimeMillis();                if (rtLongTimestamp < rtCurrentTimestamp) { // 查看LOCK_KEY这个KEY是否过期// 如果过期,则                    String rtTimestamp2 = dealWithByRedis.getSet(                            LOCK_KEY,                            String.valueOf(System.currentTimeMillis()                                    + TIMEOUT + 1)); // 调用getset方法获取之前的时间戳                    if (rtTimestamp2 != null                            && rtTimestamp.equals(rtTimestamp2)) { // 如果刚获取的时间戳和之前获取的时间戳一样的话,说明没有其他线程在占用这个锁,则此线程可以获取这个锁.                        flag = true; // 获取锁标记//return flag;                        break;                    }// else if (rtTimestamp2 != null// && rtTimestamp.equals(rtTimestamp2)) {//// 如果不一样的话,则说明已经有其他线程占用了这个锁.                }            }/** * 暂停100ms,重新循环 */            try {                Thread.sleep(100);            } catch (InterruptedException e) {                System.out.println(" e=" + e.getCause());            }        }        return flag;    }    /**     * 释放锁操作     */    public void releaseLock(String KEY) {        dealWithByRedis.del(KEY);    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 找到工作后档案怎么办 夫妻离婚后户口怎么办 异地档案辞职后怎么办 去网吧没有招聘怎么办 建筑工地老板不给钱怎么办 2018高压电工证怎么办 深圳户口怎么办户口卡 在深圳找不到工作怎么办 亲戚户口不迁出怎么办 深圳集体户口准生证怎么办 天津集体户口怎么办准生证 深圳集体户离职户口怎么办 解析包出现错误怎么办 信息登记号没有怎么办 博士非211 985怎么办 下雨考科目二怎么办 公司新装修有甲醛怎么办 驾驶证c换证怎么办 科目一上课迟到怎么办 滴滴预约不到车怎么办 科目二考挂4次怎么办 车行易骗了怎么办 驾校倒闭了学费怎么办 如果驾校倒闭了怎么办 驾校倒闭了档案怎么办 驾校跑路了怎么办 规培名额不够怎么办 驾照理论不过关怎么办 长春执照过年检怎么办 新车车检过期了怎么办 车辆保险过期了怎么办 轿车保险过期了怎么办 小货车年检过期怎么办 保险过期了缴费怎么办 车保险超过时间怎么办 车辆年审过期了怎么办? 公司没年审土地怎么办 眼镜度数不够了怎么办 驾驶证年检芒色怎么办 驾驶证逾期未审验怎么办 驾照考不过去怎么办