Redis實戰--Jedis實現分布式鎖


echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!!


分布式鎖的基本要求

  • 互斥
  • 沒有死鎖
  • 我持有的鎖只能被我釋放

分布式鎖的釋放和獲取代碼實現

package com.example.echo.redis.distlock;

import redis.clients.jedis.Jedis;

import java.util.Collections;

/**
 * @author XLecho
 * Date 2019/11/18 0018
 * Time 21:14
 */
public class DistLock {

    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";
    private static final Long RELEASE_SUCCESS = 1L;

    /**
     * 嘗試獲取分布式鎖
     *
     * @param jedis      redis客戶端
     * @param lockKey    鎖
     * @param requestId  請求標識
     * @param expireTime 超時時間
     * @return
     */
    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
        return LOCK_SUCCESS.equals(result);
    }

    /**
     * 釋放分布式鎖
     *
     * @param jedis     redis客戶端
     * @param lockKey   鎖
     * @param requestId 請求標識
     * @return
     */
    public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
        return RELEASE_SUCCESS.equals(result);
    }

}

做一個有底線的博客主


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM