日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

用Go語言&&Redis實現分布式鎖,我還是第一次

來源: 責編: 時間:2024-04-19 09:28:46 222觀看
導讀一、為什么需要分布式鎖共享資源訪問控制: 當多個節點需要同時訪問共享資源時,為了避免并發寫入導致數據不一致,需要使用分布式鎖確保同時只有一個節點可以寫入或修改共享資源。避免重復執行: 在分布式系統中,某些操作可能

一、為什么需要分布式鎖

共享資源訪問控制: 當多個節點需要同時訪問共享資源時,為了避免并發寫入導致數據不一致,需要使用分布式鎖確保同時只有一個節點可以寫入或修改共享資源。ELQ28資訊網——每日最新資訊28at.com

避免重復執行: 在分布式系統中,某些操作可能需要在整個系統中只執行一次,比如定時任務、數據初始化等。為了避免多個節點同時執行這些操作,需要使用分布式鎖來確保只有一個節點可以執行。ELQ28資訊網——每日最新資訊28at.com

任務協調: 在分布式任務隊列中,多個節點競爭執行任務時,可能需要對任務進行加鎖,以確保每個任務只被一個節點執行,避免重復執行或者操作沖突。ELQ28資訊網——每日最新資訊28at.com

防止死鎖: 在分布式系統中,由于網絡延遲、節點故障等原因,可能會導致死鎖情況的發生。分布式鎖可以用來避免死鎖的發生,通過設置合理的超時時間和重試機制,確保鎖在一定時間內被釋放。ELQ28資訊網——每日最新資訊28at.com

分布式系統中共享同一個資源時,就需要分布式鎖來確保變更資源的一致性。這就是為什么要用到分布式鎖的原因咯。ELQ28資訊網——每日最新資訊28at.com

二、分布式鎖需要具備特性

1 互斥性(Mutual Exclusion): 在任何時刻,只能有一個客戶端持有鎖,其他客戶端不能同時持有該鎖。這是最基本的鎖特性,確保在同一時間只有一個客戶端能夠訪問共享資源。ELQ28資訊網——每日最新資訊28at.com

2 安全性(Safety): 在鎖被釋放之前,任何其他客戶端都不能獲得該鎖。即使是在網絡分區、節點故障等異常情況下,也要確保鎖的安全性,避免數據不一致或者操作沖突。ELQ28資訊網——每日最新資訊28at.com

3 活性(Liveness): 鎖應該能夠在合理的時間內被獲取,避免長時間的等待導致死鎖或者無法響應其他客戶端請求?;钚砸舶ㄔ阪i被釋放后,其他客戶端能夠盡快地獲取到該鎖。ELQ28資訊網——每日最新資訊28at.com

4 容錯性(Fault Tolerance): 分布式系統中可能會發生網絡分區、節點故障等異常情況,分布式鎖需要具備容錯性,能夠在這些異常情況下正確地工作。比如,鎖的實現應該能夠處理網絡分區導致的消息丟失或者超時等情況。ELQ28資訊網——每日最新資訊28at.com

5 性能(Performance): 鎖的實現應該盡可能地減少鎖競爭和通信開銷,提高系統的性能。例如,可以使用高效的算法和數據結構來減少鎖的持有時間和等待時間,或者采用緩存和批處理等技術來減少通信開銷。ELQ28資訊網——每日最新資訊28at.com

6 可擴展性(Scalability): 鎖的實現應該能夠隨著系統規模的增長而擴展,確保在高并發和大規模的分布式環境下仍然能夠保持良好的性能和可用性。ELQ28資訊網——每日最新資訊28at.com

三、實現 Redis 鎖應先掌握的知識點

set 命令

SET key value [EX seconds] [PX milliseconds] [NX|XX]
  • EX second :設置鍵的過期時間為 second 秒。SET key value EX second 效果等同于 SETEX key second value。
  • PX millisecond :設置鍵的過期時間為 millisecond 毫秒。SET key value PX millisecond ,效果等同于 PSETEX key millisecond value 。
  • NX :鍵不存在時,才對鍵進行設置操作。SET key value NX 等同于 SETNX key value 。
  • XX :鍵已經存在時,才對鍵進行設置操作。

Redis.lua 腳本

我們可以使用 redis lua 腳本,將一系列命令操作封裝成 pipline,實現整體操作的原子性。ELQ28資訊網——每日最新資訊28at.com

加鎖的整個流程,詳細原理說明看注釋ELQ28資訊網——每日最新資訊28at.com

-- Lua 腳本實現 Redis 分布式鎖-- 生成唯一標識local requestId = ARGV[1]-- 嘗試獲取鎖local lockKey = KEYS[1]local lockValue = requestIdlocal lockExpireTime = tonumber(ARGV[2])local result = redis.call('SET', lockKey, lockValue, 'NX', 'PX', lockExpireTime)-- 判斷獲取鎖的結果if result == 'OK' then    -- 獲取鎖成功,設置鎖的過期時間    return 'OK'else    -- 獲取鎖失敗    return 'FAIL'end

1 生成唯一標識: 首先,在客戶端生成一個唯一的標識,可以是 UUID、Snowflake 算法生成的分布式 ID 等。ELQ28資訊網——每日最新資訊28at.com

2 嘗試獲取鎖: 客戶端將生成的唯一標識作為參數,調用 Redis 的 SET 命令嘗試獲取鎖??梢允褂?nbsp;NX(如果鍵不存在則設置)和 PX(設置鍵的過期時間)選項,確保只有一個客戶端能夠成功獲取到鎖。ELQ28資訊網——每日最新資訊28at.com

3 判斷獲取鎖的結果: 如果獲取鎖成功,SET 命令會返回 OK,表示當前客戶端成功獲取了鎖。如果獲取鎖失敗,說明已經有其他客戶端持有了鎖,此時客戶端需要進行等待或者返回失敗。ELQ28資訊網——每日最新資訊28at.com

4 設置鎖的過期時間: 在成功獲取鎖之后,客戶端需要設置鎖的過期時間,以防止因為客戶端崩潰或者其他原因導致鎖一直占用,造成死鎖。ELQ28資訊網——每日最新資訊28at.com

5 返回獲取鎖的結果: 根據 SET 命令的返回值,客戶端判斷是否成功獲取到了鎖,并將結果返回給調用方。ELQ28資訊網——每日最新資訊28at.com

加鎖流程圖ELQ28資訊網——每日最新資訊28at.com

圖片圖片ELQ28資訊網——每日最新資訊28at.com

解鎖流程ELQ28資訊網——每日最新資訊28at.com

if redis.call("get", KEYS[1]) == ARGV[1] then    return redis.call("del", KEYS[1])else    return 0end

1 使用 KEYS[1] 獲取傳入的鎖鍵名。ELQ28資訊網——每日最新資訊28at.com

2 使用 ARGV[1] 獲取傳入的鎖值(即加鎖時設置的唯一標識)。ELQ28資訊網——每日最新資訊28at.com

3 判斷當前鎖是否存在且鎖值與傳入的鎖值相同,若是,則調用 DEL 命令刪除該鎖,并返回 1 表示解鎖成功。ELQ28資訊網——每日最新資訊28at.com

4 若鎖不存在或鎖值不匹配,則返回 0 表示解鎖失敗。ELQ28資訊網——每日最新資訊28at.com

解鎖的流程圖ELQ28資訊網——每日最新資訊28at.com

圖片圖片ELQ28資訊網——每日最新資訊28at.com

源碼解析ELQ28資訊網——每日最新資訊28at.com

package redisimport (    "math/rand"    "strconv"    "sync/atomic"    "time"    red "github.com/go-redis/redis"    "github.com/tal-tech/go-zero/core/logx")const (    letters  = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"    randomLen = 16    // 默認超時時間,用來防止死鎖    tolerance       = 300 // milliseconds    millisPerSecond = 800    lockCommand = `if redis.call("GET", KEYS[1]) == ARGV[1] then    redis.call("SET", KEYS[1], ARGV[1], "PX", ARGV[2])    return "OK"else    return redis.call("SET", KEYS[1], ARGV[1], "NX", "PX", ARGV[2])end`    delCommand = `if redis.call("GET", KEYS[1]) == ARGV[1] then    return redis.call("DEL", KEYS[1])else    return 0end`)type redisLock struct {    // redis客戶端    store *Redis    // 超時時間    seconds uint32    // 鎖key    keys string    // 鎖value,防止鎖被別人獲取到    value string}func init() {    rand.Seed(time.Now().UnixNano())}// NewRedisLock returns a RedisLock.func NewRedisLock(store *Redis, keys string) *RedisLock {    return &RedisLock{        store: store,        keys:   keys,        // 獲取鎖時,鎖的值通過隨機字符串生成        // 實際上go-zero提供更加高效的隨機字符串生成方式        // 見core/stringx/random.go:Randn        value:    randomStr(randomLen),    }}// Acquire acquires the lock.// 加鎖func (rl *RedisLock) Acquire() (bool, error) {    // 獲取過期時間    seconds := atomic.LoadUint32(&rl.seconds)    // 默認鎖過期時間為500ms,防止死鎖    resp, err := rl.store.Eval(lockCommand, []string{rl.keys}, []string{        rl.value, strconv.Itoa(int(seconds)*millisPerSecond + tolerance),    })    if err == red.Nil {        return false, nil    } else if err != nil {        logx.Errorf("Error on lock for %s, %s", rl.key, err.Error())        return false, err    } else if resp == nil {        return false, nil    }    reply, ok := resp.(string)    if ok && reply == "OK" {        return true, nil    }    logx.Errorf("Unknown reply lock for %s: %v", rl.keys, resp)    return false, nil}// Release releases the lock.// 釋放鎖func (rl *RedisLock) Release() (bool, error) {    resp, err := rl.store.Eval(delCommand, []string{rl.keys}, []string{rl.value})    if err != nil {        return false, err    }    reply, ok := resp.(int64)    if !ok {        return false, nil    }    return reply == 1, nil}func randomStr(n int) string {    b := make([]byte, n)    for i := range b {        b[i] = letters[rand.Intn(len(letters))]    }    return string(b)}// SetExpire sets the expire.// 需要注意的是需要在Acquire()之前調用// 不然默認為300ms自動釋放func (rl *RedisLock) SetExpire(seconds int) {    atomic.StoreUint32(&rl.seconds, uint32(seconds))}

這個詳細源碼根據自己的業務需要,可以利用。ELQ28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-84022-0.html用Go語言&&Redis實現分布式鎖,我還是第一次

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Formik:讓用戶體驗更加出色的表單解決方案

下一篇: 我用這十招,減少了80%的BUG

標簽:
  • 熱門焦點
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 中興AX5400Pro+上手體驗:再升級 雙2.5G網口+USB 3.0這次全都有

    2021年11月的時候,中興先后發布了兩款路由器產品,中興AX5400和中興AX5400 Pro,從產品命名上就不難看出這是隸屬于同一系列的,但在外觀設計上這兩款產品可以說是完全沒一點關系
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 19個 JavaScript 單行代碼技巧,讓你看起來像個專業人士

    今天這篇文章跟大家分享18個JS單行代碼,你只需花幾分鐘時間,即可幫助您了解一些您可能不知道的 JS 知識,如果您已經知道了,就當作復習一下,古人云,溫故而知新嘛?,F在,我們就開始今
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 郭明錤稱華為和江淮汽車合作開發問界MPV,定價100萬左右、計劃明年量產

    8 月 1 日消息,郭明錤今天在 Medium 平臺發布博文,稱華為正在和江淮汽車合作,開發售價在 100 萬元的問界 MPV,預計在 2024 年第 2 季度量產,銷量目標為
  • 華為開發者大會2023日程公開:開設鴻蒙HarmonyOS 4體驗區

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發者大會 2023 的詳細日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發布最新一代鴻蒙 H
  • 三星顯示已開始為AR設備研發硅基LED微顯示屏

    7月18日消息,據外媒報道,隨著蘋果首款頭顯產品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產品也就將成為各大公司下一個重要的競爭領域,對顯示屏這一關
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久成人综合视频| 久久久噜噜噜久久中文字幕色伊伊| 亚洲美女网站| 国产精品久久久爽爽爽麻豆色哟哟| 欧美一区激情视频在线观看| 一本久道久久久| 国语精品中文字幕| 欧美日韩一区二区在线观看视频| 欧美一级理论片| 亚洲视频在线观看三级| 亚洲黄一区二区| 樱桃视频在线观看一区| 国产精品一区二区久久精品| 欧美日韩国产一区精品一区| 美腿丝袜亚洲色图| 久久免费的精品国产v∧| 亚洲欧美在线一区二区| 日韩午夜剧场| 亚洲精品影院在线观看| 亚洲欧美日韩精品在线| 久久只有精品| 亚洲综合精品一区二区| 日韩视频亚洲视频| 亚欧成人精品| 亚洲欧美在线免费| 免费在线看一区| 老巨人导航500精品| 欧美日韩国产小视频| 国产日韩欧美一区二区三区在线观看| 欧美三级视频在线| 欧美精品一区二区精品网 | 在线观看欧美亚洲| 中文av一区特黄| 亚洲先锋成人| 亚洲视频电影图片偷拍一区| 欧美专区日韩专区| 欧美在线啊v一区| 久久蜜桃资源一区二区老牛| 欧美日韩综合精品| 黄色一区二区在线| 亚洲第一页自拍| 在线观看日韩专区| 亚洲精品视频免费| 一本色道久久88精品综合| 午夜亚洲福利| 欧美专区在线播放| 欧美视频一区二区在线观看 | 狠狠色伊人亚洲综合网站色| 一区二区自拍| 亚洲国产高潮在线观看| 亚洲国产精品一区二区久| 亚洲精品黄色| 亚洲小少妇裸体bbw| 午夜精品久久久久久久男人的天堂| 久久综合一区二区| 国产日韩欧美制服另类| 一区二区日韩欧美| 欧美精品18+| 欧美日韩精品系列| 国产精品一区一区三区| 国产一区二区久久| 亚洲国产另类久久精品| 亚洲伦理久久| 亚洲欧美偷拍卡通变态| 久久久国产一区二区三区| 免费不卡在线观看av| 欧美日韩成人网| 国产精品美女www爽爽爽| 日韩视频三区| 欧美精品一区二区三区很污很色的 | 99re视频这里只有精品| 性久久久久久久| 欧美黄色影院| 国产精品国产三级国产专区53| 国产一区视频网站| 亚洲美女精品一区| 欧美国产日本| 国产亚洲亚洲| 日韩亚洲一区二区| 新片速递亚洲合集欧美合集| 国产精品xxxxx| 国内自拍一区| 久久国产精品99国产精| 国产日韩欧美综合精品| 亚洲国产天堂久久综合| 久久久中精品2020中文| 精品二区视频| 亚洲欧美成人在线| 免费短视频成人日韩| 国产精品盗摄一区二区三区| 一本色道久久精品| 欧美日韩在线视频观看| 国产精品99久久不卡二区 | 欧美无砖砖区免费| 亚洲深夜激情| 国产精品视频久久| 亚洲精品日日夜夜| 欧美日韩免费观看一区| 在线电影国产精品| 另类春色校园亚洲| 亚洲黄色大片| 欧美日韩国产小视频在线观看| 日韩一级网站| 国产精品高潮呻吟久久| 亚洲免费影视| 国产视频久久久久| 久久人人97超碰精品888| 在线观看欧美成人| 欧美精品亚洲精品| 在线观看三级视频欧美| 欧美一区成人| 欧美日韩另类视频| 亚洲手机视频| 国产夜色精品一区二区av| 亚洲美女视频网| 欧美日韩在线一区二区三区| 亚洲一区激情| 欧美午夜精品一区| 最新日韩精品| 亚洲电影第三页| 久久国产精品一区二区| 精品成人国产在线观看男人呻吟| 亚洲欧美一级二级三级| 国产在线不卡精品| 欧美成人一区二区三区| 在线看一区二区| 欧美日韩八区| 亚洲精品在线看| 国产精品久久久爽爽爽麻豆色哟哟 | 99精品视频网| 国产视频一区二区三区在线观看| 久久中文字幕一区| 在线一区二区日韩| 国产手机视频精品| 欧美大片一区二区三区| 在线亚洲免费| 国产一区在线看| 欧美激情久久久| 亚洲欧美日韩在线不卡| 在线看一区二区| 国产精品美女久久久浪潮软件| 一本色道久久综合| 欧美日韩高清一区| 欧美一站二站| 91久久久久久久久| 欧美成人激情视频| 亚洲人成网站777色婷婷| 国产精品美女在线| 免费成人你懂的| 亚洲专区一二三| 亚洲国产一成人久久精品| 国产精品视频99| 欧美日韩国产丝袜另类| 久久精品国产欧美激情| 国产亚洲在线| 欧美日韩国产三区| 久久三级视频| 亚洲国产激情| 国产日韩一区在线| 欧美日韩的一区二区| 久久偷窥视频| 亚洲免费在线看| 亚洲精品久久嫩草网站秘色| 欧美日韩精品| 玖玖玖国产精品| 亚洲精品国产精品乱码不99按摩| 国产亚洲视频在线| 欧美日韩在线免费| 欧美成人a视频| 一本色道88久久加勒比精品| 欧美新色视频| 欧美xart系列在线观看| 一区二区不卡在线视频 午夜欧美不卡在 | 久久激情视频久久| 亚洲视频播放| 亚洲免费观看视频| 激情一区二区三区| 欧美第一黄网免费网站| 久久av一区| 亚洲专区免费| 红桃视频成人| 国产欧美精品一区aⅴ影院| 久久久久久久成人| 亚洲精品精选| 国产精品日韩二区| 久久久蜜桃精品 | 欧美精品一区二区三区蜜臀| 亚洲欧美激情一区二区| 亚洲美女性视频| 亚洲国产精品va在线看黑人动漫| 欧美欧美午夜aⅴ在线观看| 久久夜色精品| 久久久久久穴| 久久精品视频免费播放| 99综合电影在线视频| 亚洲国产精品久久久久秋霞不卡 | 久久久一二三| 久久成人一区| 久久国产乱子精品免费女| 亚洲在线免费| 亚洲小说欧美另类婷婷| 国产精品99久久久久久有的能看 | 欧美成人免费网| 欧美成人精品不卡视频在线观看|