註解實現基於redis的分布式鎖

2021-10-25 11:03:32 字數 2685 閱讀 7518

基於註解的分布式redis鎖

分布式系統開發中常常用到分布式鎖,比如防止多個使用者同時預訂同乙個商品,傳統的synchronized就無法實現了,而基於資料庫的樂觀鎖實現又可能會對資料庫產生較大的壓力。而分布式鎖相對較輕量,對效能影響也較小。目前主流的分布式鎖都基於redis實現。使用分布式鎖的流程一般如下:

如果需要使用分布式鎖的地方有多個,那麼就需要寫多個類似的**。而重複**是開發中最常見到的bad smell。我們可以使用aop把這段邏輯抽象出來,這樣就避免了重複**,也極大地減去了工作量。

使用註解(假設註解為@lock)宣告要使用分布式鎖的業務method、要鎖定的物件(一般是業務主鍵)、失效時間等資訊。在這裡插入**片使用spring aoparround(環繞通知)增強被@lock註解的方法,把前面提到的」使用分布式鎖的流程「邏輯抽象到切面中。

使用redis實現分布式鎖。一般是基於string型別的set命令實現。

如何根據請求的不同,鎖定不同的物件

可以使用spring el表示式指定鎖定物件,加鎖時根據業務方法引數值、引數名稱解析表示式,得出要加鎖的物件(redis string的key)。

分布式鎖該如何選擇

使用時只需在業務方法上加乙個註解就可以了,使用靈活、開發效率高、侵入小、適用性強。業務方法只需專注於業務**,可讀性強,易維護。

pom

org.springframework.boot

spring-boot-starter-data-redis

org.springframework.boot

spring-boot-starter-integration

org.springframework.integration

spring-integration-redis

定義註解 lock

/**

* @author l'amour solitaire

* @description 用於標記redis鎖

* @date 2020/11/17 下午3:14

**/@target()

@retention(retentionpolicy.runtime)

@documented

public @inte***ce mlock

service

所有屬性都有預設值,可直接使用@mlock

/**

* @author l'amour solitaire

* @description todo

* @date 2020/12/14 上午8:33

**/@service

public class peopleservice

}

cotroller

import com.aeert.lock.service.lockservice;

import com.aeert.lock.utils.r;

import lombok.requiredargsconstructor;

import org.springframework.beans.factory.annotation.autowired;

import org.springframework.web.bind.annotation.restcontroller;

/** * @author l'amour solitaire

* @description 測試redis鎖

* @date 2020/11/17 上午9:27

**/@restcontroller

@requiredargsconstructor(onconstructor_ = @autowired)

public class testcontroller

public r test1(string param1, string param2, string param3)

}

下面兩個介面同時訪問時會被攔截:

redis資料儲存結構

至此已經可以很方便的實現我們的需求了!

原始碼以及**倉庫呼叫: 方法鎖

基於redis分布式鎖註解版

思路使用aop,實現起來比較簡單,直接上 了 註解類 retention retentionpolicy.runtime target elementtype.method inherited documented public inte ce redislock切面 aspect componen...

基於Redis實現分布式鎖

分布式鎖的基本功能 1.同一時刻只能存在乙個鎖 2.需要解決意外死鎖問題,也就是鎖能超時自動釋放 3.支援主動釋放鎖 分布式鎖解決什麼問題 多程序併發執行任務時,需要保證任務的有序性或者唯一性 準備 redis版本 2.6 redis是主從 sentinel模式 為了高可用 原理 redis2.6之...

基於Redis實現分布式鎖

之前專案中使用redis鎖實現秒殺等一些併發業務,在這裡整理一下基於redis實現分布式鎖的簡單入門例項,記錄一下,便於以後檢視 學習。springboot整合redisson分布式鎖 1 簡介 在分布式系統中存在併發場景,為了解決這一問題,基於redis鎖一定程度可以解決這一問題,但是也有缺點,如...