色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    4823

    瀏覽量

    68899
  • Lua
    Lua
    +關注

    關注

    0

    文章

    81

    瀏覽量

    10583
  • Redis
    +關注

    關注

    0

    文章

    378

    瀏覽量

    10907
收藏 人收藏

    評論

    相關推薦

    redis分布式場景實現

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

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

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

    Redis 分布式的正確實現方式

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

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

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

    Redis分布式真的安全嗎?

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

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

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

    redis分布式如何實現

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

    redis分布式可能出現的問題

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

    redis分布式死鎖處理方案

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

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

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

    如何實現Redis分布式

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

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

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

    淺析Redis 分布式解決方案

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

    redis分布式的缺點

    Redis分布式是一種常見的用于解決分布式系統中資源爭用問題的解決方案。盡管Redis分布式
    的頭像 發表于 12-04 14:05 ?1305次閱讀
    主站蜘蛛池模板: 亚洲欧洲日本天天堂在线观看 | 久久久久久免费观看 | 在线视频 亚洲 | 97资源站超碰在线视频 | 老司机亚洲精品影院 | 妙玉被肉干高H潮文 | 伊人国产在线观看 | 国产亚洲精品视频在线网 | 邓奴的视频IVK | 亚洲AV噜噜狠狠网址蜜桃尤物 | 日本精品久久久久中文字幕 1 | 久久久久久久网站 | 蜜臀AV熟女人妻中文字幕 | 国产 欧美 亚洲 日韩视频 | 玩弄朋友娇妻呻吟交换电影 | 久久国产高清视频 | 国产亚洲精品福利视频 | 国精产品一区一区三区有限 | 精品无码久久久久久久动漫 | 恋夜影院安卓免费列表uc | 男女免费观看在线爽爽爽视频 | 成人网18免费韩国 | 97免费视频观看 | 午夜福利网国产A | 99久久免费精品国产 | 一本到2v不卡区 | 婷婷久久综合九色综合伊人色 | 国产精品你懂得 | 午夜福到在线4国产 | 国产精品久久久久久AV免费不卡 | 伊人色综合久久天天网 | 国产女合集小岁9三部 | 亚洲AV国产精品无码精 | 538在线播放 | 中文字幕亚洲第一页 | 男人边吃奶边挵进去呻吟漫画 | 边做边爱BD免费看片 | 国产九九九九九九九A片 | 国产曰韩无码亚洲视频 | 夜色88V精品国产亚洲AV | 性西欧俄罗斯极品 |