1. 程式人生 > >【隨筆】Java 基於Redis分散式鎖

【隨筆】Java 基於Redis分散式鎖

定義介面


public interface IDistributedLock {
    boolean tryLock(String var1, Object var2);

    boolean tryLock(String var1, Object var2, int var3);

    boolean unLock(String var1, Object var2);
}

實現類

public class DistributedLockImpl {
    
    private static final String lockScript = "local n = redis.call('setnx',KEYS[1],ARGV[1])\nif n == 1 then redis.call('expire',KEYS[1],ARGV[2]) end\nreturn n";
    @Autowired
    private RedisTemplate template;
   
    private int defaultExpireTime = 3;

    public DistributedLockImpl() {
    }

    public boolean tryLock(String busiType, Object key) {
        return this.tryLock(busiType, key, this.defaultExpireTime);
    }

    public boolean tryLock(String busiType, Object key, int expire) {
        return (Boolean)this.template.execute((jedis) -> {
            String lockKey = this.getLockKey(busiType, key);
            String lockValue = this.getLockValue(busiType, key);
            boolean locked = (Long)jedis.eval("local n = redis.call('setnx',KEYS[1],ARGV[1])\nif n == 1 then redis.call('expire',KEYS[1],ARGV[2]) end\nreturn n", 1, new String[]{lockKey, lockValue, String.valueOf(expire)}) > 0L;
          
            return locked;
        });
    }

    public boolean unLock(String busiType, Object key) {
        return (Boolean)this.template.execute((jedis) -> {
            String lockedKey = this.getLockKey(busiType, key);
                if (jedis.del(lockedKey) > 0L) {
                    return true;
                } else {
                    return false;
                }
        });
    }

    private String getLockKey(String busiType, Object key) {
        Objects.requireNonNull(busiType);
        Objects.requireNonNull(key);
        return busiType + "_" + key;
    }

    private String getLockValue(String busiType, Object key) {
        Objects.requireNonNull(busiType);
        Objects.requireNonNull(key);
        return "lock_" + busiType + "_" + key + "_" + (new SecureRandom()).nextInt();
    }
}

相關推薦

隨筆Java 基於Redis分散式

定義介面 public interface IDistributedLock { boolean tryLock(String var1, Object var2); boolean tryLock(String var1, Object var2, i

基於Redis分散式(獲取及解

  目前幾乎很多大型網站及應用都是分散式部署的,分散式場景中的資料一致性問題一直是一個比較重要的話題。分散式的CAP理論告訴我們“任何一個分散式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分割槽容錯性(Partition tolerance),最多隻能同時滿足兩項。

Java併發問題--樂觀與悲觀以及樂觀的一種實現方式-CAS

首先介紹一些樂觀鎖與悲觀鎖: 悲觀鎖:總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上

RedisSpringBoot整合Redis分散式以及Redis快取

整合Redis 首先在pom.xml中加入需要的redis依賴和快取依賴 <!-- 引入redis依賴 --> <dependency>     <groupId>org.springframework.boot</grou

基於redis分散式實現“秒殺”

最近在專案中遇到了類似“秒殺”的業務場景,在本篇部落格中,我將用一個非常簡單的demo,闡述實現所謂“秒殺”的基本思路。 業務場景 所謂秒殺,從業務角度看,是短時間內多個使用者“爭搶”資源,這裡的資源在大部分秒殺場景裡是商品;將業務抽象,技術角度看,秒殺就是

Java實現Redis分散式

1、背景: 在多執行緒環境下,通常會使用鎖來保證有且只有一個執行緒來操作共享資源。比如: object obj = new object();lock (obj) { //操作共享資源 } 利用作業系統提供的鎖機制,可以確保多執行緒或多程序下的併發唯一操作。但如果在多機

javaredis分散式的工具類

package com.qlchat.redis.cache; import java.util.*; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory;

基於redis分散式

錯誤方法:setnx獲取鎖,拿到鎖用expire給鎖加一個過期時間,防止鎖忘記釋放。如果setnx執行之後expire執行之前,執行緒死掉,那鎖就永遠得不到釋放,發生死鎖。Long result = jedis.setnx(lockKey, requestId);if (re

基於Redis分散式的正確開啟方式

分散式鎖是在分散式環境下(多個JVM程序)控制多個客戶端對某一資源的同步訪問的一種實現,與之相對應的是執行緒鎖,執行緒鎖控制的是同一個JVM程序內多個執行緒之間的同步。分散式鎖的一般實現方法是在應用伺服器之外通過一個共享的儲存伺服器儲存鎖資源,同一時刻只有一個客戶端能佔有鎖資源來完成。通常有基於Zookeep

請求去重java基於分散式解決重複請求問題

問題:開發app時,app快速連續點選會向伺服器連續發起請求,導致資料庫出現重複資料。 解決思路: 對使用者唯一標示+請求uri+請求引數進行去重。 1、利用jvm BlockingQueue堵塞佇列,來一條請求判斷是否存在佇列,不存在新增,存在去除。 優點:消耗資源

拜託,面試請不要再問我Redis分散式的實現原理!石杉的架構筆記

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至五早8點半!精品技術文章準時送上! 目錄 一、寫在前面 二、Redisson實現Redis分散式鎖的底層原理       (1)加鎖機制       (2)鎖互斥機制  

分散式快取——-基於redis分散式快取的實現

一:Redis 是什麼? Redis是基於記憶體、可持久化的日誌型、Key-Value資料庫 高效能儲存系統,並提供多種語言的API. 二:出現背景 資料結構(Data Structure)需求

分散式架構(10)---基於Redis元件的特性,實現一個分散式限流

分散式---基於Redis進行介面IP限流 場景 為了防止我們的介面被人惡意訪問,比如有人通過JMeter工具頻繁訪問我們的介面,導致介面響應變慢甚至崩潰,所以我們需要對一些特定的介面進行IP限流,即一定時間內同一IP訪問的次數是有限的。 實現原理 用Redis作為限流元件的核心的原理,將使用者的IP地址當

Redis 分散式(1)一把簡單的“

原文連結:[https://www.changxuan.top/?p=1230](https://www.changxuan.top/?p=1230) 在單體架構向分散式叢集架構演進的過程中,專案中必不可少的一個功能元件就是分散式鎖。在開發團隊有技術積累的情況下,做為團隊的一個“工具人”往往有限的時間都投

轉載java 客戶端鏈接不上redis解決方案 (jedis)

主機 rom number table 出現 gin 現在 start http 本文出自:http://blog.csdn.net/lulidaitian/article/details/51946169 出現問題描述: 1.Could not get a resou

redis,1java操作redis: 將string、list、map、自己定義的對象保存到redis

n) spa 存儲 div ber sys mil 操作 write 一、操作string 、list 、map 對象 1、引入jar: jedis-2.1.0.jar 2、代碼 /

Java學習---Java和Mysql的機制

tps www. 鎖機制 www http ava mysql href 和數 【原文】https://www.toutiao.com/i6593861446428262916/ Java和數據庫的鎖機制 https://www.toutiao.com/i659386144

Java 正確實現 redis 分散式

Java 正確實現 redis 分散式鎖 Java 正確實現 redis 分散式鎖 1 源起 2 我想要的效果 3 擼起袖子開幹 3.1 匯入 jedis 依賴

Redis分散式Java實現類

Redis分散式鎖Java實現類   package com.utils; import java.util.Collections; import java.util.UUID; import redis.clients.jedis.Jedis; public cla

Java架構-拜託,面試請不要再問我Redis分散式的實現原理

一、寫在前面 現在面試,一般都會聊聊分散式系統這塊的東西。通常面試官都會從服務框架(Spring Cloud、Dubbo)聊起,一路聊到分散式事務、分散式鎖、ZooKeeper等知識。 所以咱們這篇文章就來聊聊分散式鎖這塊知識,具體的來看看Redis分散式鎖的實現原理。 說實