在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用redis實現分布式鎖的lua腳本出現和資料說明

Wildesbeast ? 來源:搜狐新聞 ? 作者:程序猿的內心獨白 ? 2019-12-01 11:00 ? 次閱讀

1.lua簡介

從 Redis 2.6.0 版本開始,通過內置的 Lua 解釋器,可以使用 EVAL 命令對 Lua 腳本進行求值。

Redis 使用單個 Lua 解釋器去運行所有腳本,并且, Redis 也保證腳本會以原子性(atomic)的方式執行:當某個腳本正在運行的時候,不會有其他腳本或 Redis 命令被執行。這和使用 MULTI / EXEC 包圍的事務很類似。在其他別的客戶端看來,腳本的效果(effect)要么是不可見的(not visible),要么就是已完成的(already completed)。

2.Lua腳本配置流程

在resource目錄下面新增一個后綴名為.lua結尾的文件

編寫腳本執行內容

調用redisTemplate.execute方法執行腳本

3.lua eval:http://doc.redisfans.com//eval.html 4.本地起兩個服務節點作為演示。演示代碼如下:

本文采用定時調度模擬線程去獲取鎖(鏈接:詳解Scheduled定時調度)

使用-Dserver.port=9527,-Dserver.port=9528開啟多個節點

local lock_key = KEYS[1]

local lock_value = KEYS[2]

local result = redis.call(‘SETNX’,lock_key,lock_value)

if result == 1

then

redis.call(‘SETEX’,lock_key,60,lock_value)

return result

else

return result

end

lua腳本redis客戶端執行命令如下:

redis-cli --eval xxxx.lua value value 。..。..。

ps:執行成功返回1,失敗返回0

local lock_key = KEYS[1]

local lock_value = KEYS[2]

local lock_time_out = KEYS[3]

local result = redis.call(‘SET’,lock_key,lock_value,‘EX’,lock_time_out,‘NX’)

return result

ps:執行成功返回OK,失敗返回nil

@Component

public class RedisLock {

@Autowired

private RedisTemplate redisTemplate;

private DefaultRedis《Boolean》 lock;

@Value(“${server.port}”)

private String port;

@Scheduled(cron = “0/5 * * * * *”)

public void lock {

String lock = “LockNxExJob”;

Boolean absent = false;

try {

// 獲取鎖

absent = luaExpress (lock, port);

if (!absent) {

System.out.println (String.format (“獲取鎖失敗!被%s拿走”, redisTemplate.opsForValue .get (lock)));

} else {

System.out.println (String.format (“獲取鎖成功!值為:%s”, redisTemplate.opsForValue .get (lock)));

}

} catch (Exception e) {

e.printStackTrace ;

} finally {

// 釋放鎖

if (absent) redisTemplate.delete (lock);

}

}

public Boolean luaExpress(String key, String value) {

lock = new DefaultRedis《》 ;

lock.setSource (new ResourceSource (new ClassPathResource (“lua\redis.lua”)));

lock.setResultType (Boolean.class);

List《Object》 list = new ArrayList《》 ;

list.add (key);

list.add (value);

Boolean result = (Boolean) redisTemplate.execute (lock, list);

return result;

}

}

ps:當節點9527成功獲取分布式鎖,在沒有執行釋放鎖之前,服務節點宕掉了,節點9528則會無法獲取到鎖,直到設置鎖的超時時間結束,才能獲得鎖。避免了單節點掛掉了,鎖一直未被釋放的尷尬場景。

5.總結

Redis 使用單個 Lua 解釋器去運行所有腳本,并且, Redis 也保證腳本會以原子性(atomic)的方式執行:當某個腳本正在運行的時候,不會有其他腳本或 Redis 命令被執行,保證了只要能setnx成功就能setex。解決了服務獲取鎖成功,但突然宕機,未能設置超時時間問題。
責任編輯 LK

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4788

    瀏覽量

    68612
  • Lua
    Lua
    +關注

    關注

    0

    文章

    81

    瀏覽量

    10562
  • Redis
    +關注

    關注

    0

    文章

    375

    瀏覽量

    10877
收藏 人收藏

    評論

    相關推薦

    redis分布式場景實現

    今天帶大家深入剖析一下Redis分布式,徹底搞懂它。 場景 既然要搞懂Redis分布式,那肯
    的頭像 發表于 09-25 17:09 ?722次閱讀

    在 Java 中利用 redis 實現一個分布式服務

    在 Java 中利用 redis 實現一個分布式服務
    發表于 07-05 13:14

    Redis 分布式的正確實現方式

    分布式一般有三種實現方式:1. 數據庫樂觀;2. 基于Redis分布式
    的頭像 發表于 05-31 14:19 ?3597次閱讀

    Redis分布式的正確使用方式探討

    大家指出哈,一起學習一起進步。 什么是分布式 方案一:SETNX + EXPIRE 方案二:SETNX + value值是(系統時間+過期時間) 方案三:使用Lua腳本(包含SETN
    的頭像 發表于 03-30 10:53 ?1502次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>的正確使用方式探討

    Redis分布式真的安全嗎?

    今天我們來聊一聊Redis分布式
    的頭像 發表于 11-02 14:07 ?1008次閱讀

    如何使用注解實現redis分布式

    使用 Redis 作為分布式,將的狀態放到 Redis 統一維護,解決集群中單機 JVM 信息不互通的問題,規定操作順序,保護用戶的數據
    發表于 04-25 12:42 ?664次閱讀
    如何使用注解<b class='flag-5'>實現</b><b class='flag-5'>redis</b><b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>!

    深入理解redis分布式

    深入理解redis分布式 哈嘍,大家好,我是指北君。 本篇文件我們來介紹如何Redis實現分布式
    的頭像 發表于 10-08 14:13 ?955次閱讀
    深入理解<b class='flag-5'>redis</b><b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>

    redis分布式如何實現

    Redis分布式是一種基于Redis實現的機制,可以用于多個進程或多臺服務器之間對共享資源的并發訪問控制。在
    的頭像 發表于 11-16 11:29 ?537次閱讀

    redis分布式可能出現的問題

    Redis分布式是一種常用的機制,用于解決多個進程或多臺服務器對共享資源的并發訪問問題。然而,由于分布式環境的復雜性,使用
    的頭像 發表于 11-16 11:40 ?1401次閱讀

    redis分布式死鎖處理方案

    引言: 隨著分布式系統的廣泛應用,尤其是在大規模并發操作下,對并發控制的需求越來越高。Redis分布式作為一種常見的分布式
    的頭像 發表于 11-16 11:44 ?1758次閱讀

    redis分布式的應用場景有哪些

    Redis分布式是一種基于Redis實現分布式
    的頭像 發表于 12-04 11:21 ?1440次閱讀

    如何實現Redis分布式

    機制,下面將詳細介紹如何實現Redis分布式。 一、引言 在分布式系統中,多個節點可能同時讀寫同一共享資源。如果沒有
    的頭像 發表于 12-04 11:24 ?706次閱讀

    redis分布式可能出現的問題及解決方案

    Redis分布式是一種常見的解決分布式系統中并發問題的方案。雖然Redis分布式鎖具有許多優點
    的頭像 發表于 12-04 11:29 ?982次閱讀

    淺析Redis 分布式解決方案

    Redis 分布式解決方案是一種基于Redis實現分布式
    的頭像 發表于 12-04 14:00 ?499次閱讀

    redis分布式的缺點

    Redis分布式是一種常見的用于解決分布式系統中資源爭用問題的解決方案。盡管Redis分布式
    的頭像 發表于 12-04 14:05 ?1257次閱讀
    主站蜘蛛池模板: 天天做天天爱夜夜爽| 免费一级毛片在线播放| 国产精品片| 一级一片免费视频播放| 免费人成黄页在线观看日本| 天天做天天玩天天爽天天| 俺也操| 四虎影视最新| 在线观看s色| h网站在线| 亲女乱h文小兰第一次| 午夜不卡影院| 男女性生动态免费视频| 免费高清在线爱做视频| 免费国产小视频| 在线免费观看一级毛片| 国产色系视频在线观看免费| 国产理论在线| 性a爱片免费视频性| 四虎在线精品免费高清在线| 老司机深夜影院入口aaaa| 六月婷婷在线视频| 午夜骚片| 精品看片| 亚洲成a人片在线观看导航| 高清国产亚洲va精品| 欧美性白人极品1819hd| 日日噜噜夜夜狠狠va视频| 天天好比| 伊人久久大香线焦在观看| 丁香五香天堂网| dyav午夜片| 六月激情网| 视色4setv.com| 日韩欧美视频在线一区二区| 人人天天爱天天做天天摸| 一级一片免费视频播放| 97青草| 性做久久久久久久| 韩国特黄特色a大片免费| 免费视频现线观看|