最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker實(shí)現(xiàn)容器化的分布式鎖服務(wù)RedisLock的快速搭建

 更新時(shí)間:2026年04月24日 10:01:17   作者:冷炫風(fēng)刃  
本文主要介紹了Docker實(shí)現(xiàn)容器化的分布式鎖服務(wù)RedisLock的快速搭建,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

基于搜索結(jié)果,我為你梳理了 Docker 快速搭建 Redis 分布式鎖服務(wù)的完整方案。核心思路是:先通過 Docker 部署 Redis 實(shí)例,再通過成熟的客戶端庫(如 Java 的 Redisson、Go 的 redislock)實(shí)現(xiàn)分布式鎖邏輯,避免從零造輪子。

一、方案選型對(duì)比

方案復(fù)雜度可靠性適用場(chǎng)景
SET NX + Lua 手動(dòng)實(shí)現(xiàn)學(xué)習(xí)原理,不推薦生產(chǎn)
Redisson (Java)Java 生態(tài),生產(chǎn)首選
redislock (Go)Go 生態(tài),輕量易用
Redlock 算法極高多主節(jié)點(diǎn)高可用場(chǎng)景

生產(chǎn)環(huán)境強(qiáng)烈推薦 Redisson 或 redislock,它們內(nèi)置了看門狗自動(dòng)續(xù)期、可重入鎖等機(jī)制。

二、Docker 快速部署 Redis

1. 單節(jié)點(diǎn)快速啟動(dòng)(開發(fā)測(cè)試)

# 拉取官方鏡像
docker pull redis:7.2
# 運(yùn)行容器(帶密碼認(rèn)證,持久化目錄掛載)
docker run -d \
  --name redis-lock \
  -p 6379:6379 \
  -v /data/redis:/data \
  redis:7.2 \
  redis-server --requirepass yourpassword --appendonly yes

2. Docker Compose 部署(推薦,含生產(chǎn)級(jí)配置)

創(chuàng)建 docker-compose.yml

services:
  redis:
    container_name: redis-lock-server
    image: redis:7.2
    restart: always
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    sysctls:
      - net.core.somaxconn=511
    environment:
      - TZ=Asia/Shanghai
    networks:
      - lock-net
    ports:
      - "6379:6379"
    volumes:
      - ./data:/data
      - ./config/redis.conf:/usr/local/etc/redis/redis.conf:ro
    command: redis-server /usr/local/etc/redis/redis.conf
networks:
  lock-net:
    driver: bridge

創(chuàng)建 config/redis.conf

# 基礎(chǔ)配置
port 6379
bind 0.0.0.0
daemonize no
dir /data
# 安全認(rèn)證(分布式鎖必須設(shè)置,防止未授權(quán)釋放)
requirepass yourpassword
# 持久化(AOF + RDB 雙保險(xiǎn))
appendonly yes
appendfsync everysec
save 900 1
save 300 10
save 60 10000
# 內(nèi)存與性能
maxmemory 256mb
maxmemory-policy noeviction

啟動(dòng):

mkdir -p data config
docker compose up -d

三、客戶端實(shí)現(xiàn)分布式鎖

方案 A:Java + Redisson(生產(chǎn)級(jí))

Maven 依賴:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.27.0</version>
</dependency>

配置類:

@Configuration
public class RedissonConfig {
    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer()
              .setAddress("redis://localhost:6379")
              .setPassword("yourpassword")
              .setConnectionMinimumIdleSize(10);
        return Redisson.create(config);
    }
}

業(yè)務(wù)使用:

@Service
public class OrderService {
    @Autowired
    private RedissonClient redissonClient;
    public void deductStock(Long productId) {
        // 鎖命名規(guī)范:業(yè)務(wù):資源:ID
        RLock lock = redissonClient.getLock("lock:stock:" + productId);
        try {
            // 嘗試加鎖,最多等待3秒,鎖10秒后自動(dòng)釋放
            // 不指定leaseTime時(shí),Redisson 看門狗會(huì)自動(dòng)續(xù)期(默認(rèn)30秒檢查一次)
            boolean locked = lock.tryLock(3, 10, TimeUnit.SECONDS);
            if (!locked) {
                throw new RuntimeException("獲取鎖失敗,請(qǐng)重試");
            }
            // 執(zhí)行業(yè)務(wù)邏輯...
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // 必須判斷當(dāng)前線程是否持有鎖,避免誤釋放
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }
}

Redisson 核心優(yōu)勢(shì):

  • 看門狗機(jī)制:業(yè)務(wù)未執(zhí)行完時(shí)自動(dòng)續(xù)期,防止鎖提前釋放
  • 可重入鎖:同一線程可多次獲取同一鎖
  • Lua 原子操作:加鎖/解鎖均為原子性,避免競(jìng)態(tài)條件

方案 B:Go + redislock(輕量級(jí))

package main
import (
    "context"
    "fmt"
    "time"
    "github.com/bsm/redislock"
    "github.com/redis/go-redis/v9"
)
func main() {
    // 連接 Redis
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "yourpassword",
        DB:       0,
    })
    // 創(chuàng)建鎖管理器
    locker := redislock.New(client)
    ctx := context.Background()
    // 獲取鎖(TTL 10秒,重試策略)
    lock, err := locker.Obtain(ctx, "my-lock", 10*time.Second, &redislock.Options{
        RetryStrategy: redislock.LinearBackoff(100 * time.Millisecond),
    })
    if err == redislock.ErrNotObtained {
        fmt.Println("鎖已被占用")
        return
    } else if err != nil {
        panic(err)
    }
    // 必須釋放鎖
    defer lock.Release(ctx)
    fmt.Println("獲取鎖成功,執(zhí)行業(yè)務(wù)...")
    time.Sleep(5 * time.Second)
}

四、高可用進(jìn)階:Redlock 多主部署

當(dāng)單節(jié)點(diǎn) Redis 存在單點(diǎn)故障風(fēng)險(xiǎn)時(shí),可采用 Redis 官方推薦的 Redlock 算法:

Docker Compose 部署 3 主節(jié)點(diǎn)

services:
  redis-master-1:
    image: redis:7.2
    container_name: redlock-1
    ports: ["6381:6379"]
    command: redis-server --port 6379 --appendonly yes
  redis-master-2:
    image: redis:7.2
    container_name: redlock-2
    ports: ["6382:6379"]
    command: redis-server --port 6379 --appendonly yes
  redis-master-3:
    image: redis:7.2
    container_name: redlock-3
    ports: ["6383:6379"]
    command: redis-server --port 6379 --appendonly yes

Redisson Redlock 配置

Config config = new Config();
config.useRedLock()
    .addSlaveAddress("redis://localhost:6381", "redis://localhost:6382", "redis://localhost:6383");
RedissonClient redisson = Redisson.create(config);
RLock lock = redisson.getRedLock("myLock"); // 紅鎖

Redlock 核心邏輯:

  • 記錄起始時(shí)間 T1
  • 向 N 個(gè)獨(dú)立主節(jié)點(diǎn)順序申請(qǐng)鎖,每個(gè)節(jié)點(diǎn)設(shè)置短超時(shí)(如 50ms)
  • 計(jì)算獲取耗時(shí) T2 - T1
  • 僅在 大多數(shù)節(jié)點(diǎn)(N/2+1)加鎖成功 且 總耗時(shí) < 鎖有效期 時(shí)才算成功
  • 失敗時(shí)向所有節(jié)點(diǎn)發(fā)送解鎖指令

五、關(guān)鍵避坑指南

坑點(diǎn)正確做法
SETNX + EXPIRE 分步執(zhí)行使用 SET key value NX PX 30000 原子命令 
鎖到期但業(yè)務(wù)未完成使用 Redisson 看門狗自動(dòng)續(xù)期,或合理評(píng)估業(yè)務(wù)耗時(shí)設(shè)置 TTL
A 客戶端釋放 B 客戶端的鎖鎖 value 使用唯一隨機(jī)值(UUID+線程ID),釋放前 Lua 校驗(yàn)
集群主從切換導(dǎo)致鎖丟失生產(chǎn)環(huán)境使用 Redlock 或多主節(jié)點(diǎn)部署
未處理鎖續(xù)期失敗捕獲異常,設(shè)置業(yè)務(wù)最大執(zhí)行時(shí)間兜底

六、快速驗(yàn)證腳本

啟動(dòng)后驗(yàn)證 Redis 與鎖功能:

# 進(jìn)入容器
docker exec -it redis-lock-server redis-cli -a yourpassword
# 測(cè)試原子加鎖
SET mylock myrandomvalue NX PX 30000
# 返回 OK 表示加鎖成功
# 模擬釋放鎖(Lua 腳本保證原子性)
EVAL "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end" 1 mylock myrandomvalue

總結(jié):通過 Docker 可在 5 分鐘內(nèi)完成 Redis 分布式鎖基礎(chǔ)設(shè)施搭建。開發(fā)環(huán)境用單節(jié)點(diǎn) + Redisson/redislock 即可;生產(chǎn)環(huán)境建議采用 Redlock 多主節(jié)點(diǎn) 或 Redis Cluster + Redisson 方案,確保鎖服務(wù)的高可用與強(qiáng)一致性。

到此這篇關(guān)于Docker實(shí)現(xiàn)容器化的分布式鎖服務(wù)RedisLock的快速搭建的文章就介紹到這了,更多相關(guān)Docker分布式鎖RedisLock搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • docker容器無法ping域名問題及解決

    docker容器無法ping域名問題及解決

    這篇文章主要介紹了docker容器無法ping域名問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Docker部署Apollo的實(shí)現(xiàn)步驟

    Docker部署Apollo的實(shí)現(xiàn)步驟

    眾所周知分布式配置中心在目前也可以說是企業(yè)中項(xiàng)目的標(biāo)配了,本文主要介紹了Docker 部署Apollo的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Docker 網(wǎng)絡(luò)之端口綁定的方法

    Docker 網(wǎng)絡(luò)之端口綁定的方法

    本篇文章主要介紹了Docker 網(wǎng)絡(luò)之端口綁定的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • 解決docker容器重啟之后/etc下某些配置文件被重置的問題

    解決docker容器重啟之后/etc下某些配置文件被重置的問題

    這篇文章主要介紹了解決docker容器重啟之后/etc下某些配置文件被重置的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 解決docker修改mysql配置文件的問題

    解決docker修改mysql配置文件的問題

    今天在用docker啟動(dòng)一個(gè)5.7的數(shù)據(jù)庫在建表時(shí)候遇到一個(gè)問題,但是很快就解決了,下面小編給大家講解下docker怎么修改mysql內(nèi)部的配置,感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • CentOS8上用Docker部署開源項(xiàng)目Tcloud的教程

    CentOS8上用Docker部署開源項(xiàng)目Tcloud的教程

    這篇文章主要介紹了CentOS8上用Docker部署開源項(xiàng)目Tcloud,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Docker-Compose創(chuàng)建mysql容器詳解

    Docker-Compose創(chuàng)建mysql容器詳解

    這篇文章主要介紹了Docker-Compose創(chuàng)建mysql容器詳解的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Docker安裝MySQL8.0的詳細(xì)步驟(附圖文!)

    Docker安裝MySQL8.0的詳細(xì)步驟(附圖文!)

    Windows上安裝MySQL相對(duì)來說會(huì)較為簡(jiǎn)單,但是在Docker安裝就沒那么簡(jiǎn)單了,下面這篇文章主要給大家介紹了關(guān)于Docker安裝MySQL8.0的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • docker?hub在線編譯github代碼實(shí)現(xiàn)

    docker?hub在線編譯github代碼實(shí)現(xiàn)

    本文主要介紹了docker?hub在線編譯github代碼實(shí)現(xiàn),包含創(chuàng)建倉庫并在線編譯項(xiàng)目,解決本地依賴?yán)∈栴},最終通過docker?push推送鏡像,感興趣的可以了解一下
    2025-05-05
  • 使用elasticsearch定時(shí)刪除索引數(shù)據(jù)

    使用elasticsearch定時(shí)刪除索引數(shù)據(jù)

    這篇文章主要介紹了使用elasticsearch定時(shí)刪除索引數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評(píng)論

仪征市| 和田县| 长乐市| 永兴县| 金湖县| 荥阳市| 丽江市| 定边县| 芜湖县| 惠来县| 岗巴县| 延吉市| 赤峰市| 宜宾市| 永胜县| 南溪县| 蓬溪县| 北流市| 汾西县| 同仁县| 新宾| 石景山区| 本溪| 南阳市| 嵊州市| 余姚市| 镇远县| 嘉峪关市| 丽江市| 郑州市| 江北区| 汶上县| 勃利县| 洱源县| 铜山县| 左权县| 铜川市| 齐齐哈尔市| 广东省| 徐汇区| 泸州市|