国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Redis】Redis 的學習教程(十二)之在 Redis使用 lua 腳本

這篇具有很好參考價值的文章主要介紹了【Redis】Redis 的學習教程(十二)之在 Redis使用 lua 腳本。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

lua 菜鳥教程:https://www.runoob.com/lua/lua-tutorial.html

在 Redis 使用 lua 腳本的好處:

  1. 減少網絡開銷??梢詫⒍鄠€請求通過腳本的形式一次發(fā)送,減少網絡時延及開銷
  2. 原子性操作。Redis會將整個腳本作為一個整體執(zhí)行,中間不會被其他請求插入。因此在腳本運行過程中無需擔心會出現(xiàn)競態(tài)條件,無需使用事務
  3. 復用。客戶端發(fā)送的腳本會永久存在redis中,這樣其他客戶端可以復用這一腳本,而不需要使用代碼完成相同的邏輯

1. 常用命令

  • EVAL:將腳本 script 添加到腳本緩存中,并且立即執(zhí)行這個腳本
    • 語法:EVAL script numkeys key [key …] arg [arg …]
    • 參數含義:
      • script:是 Lua5.1 腳本程序。此Lua腳本不需要也不應該定義函數,它運行在 Redis 服務器中
      • numkeys:鍵名參數的個數。即:key [key …] 中 key 的個數。如沒有 key,則為 0
      • key[]:鍵名參數,表示在腳本中所用到的那些 Redis 鍵(key),這些鍵名參數可以在 lua 中通過全局變量 KEYS 數組。在 lua 腳本中通過 KEYS[1],KEYS[2] 獲取
      • arg [arg …] :不是鍵名參數的附加參數,可以在 lua 中通過全局變量 ARGV 數組訪問。在 lua 腳本中通過 ARGV[1],ARGV[2] 獲取
    • 案例
      1. 調用 set 方法:EVAL "return redis.call('set', 'name', 'bob')" 0
      2. 調用 set 方法(使用參數):EVAL "return redis.call('set', KEYS[1], ARGV[1])" 1 name jack
  • EVALSHA:根據給定的 sha1 校驗碼,執(zhí)行緩存在服務器中的腳本。將腳本緩存到服務器的操作可以通過 SCRIPT LOAD 命令進行。這個命令的其他地方,比如參數的傳入方式,都和 EVAL 命令一樣
    • 語法:EVALSHA sha1 numkeys key [key ...] arg [arg ...]
  • SCRIPT LOAD:將腳本 script 添加到腳本緩存中,但并不立即執(zhí)行這個腳本。 在腳本被加入到緩存之后,通過 EVALSHA 命令,可以使用腳本的 SHA1 校驗和來調用這個腳本。
    腳本可以在緩存中保留無限長的時間,直到執(zhí)行 SCRIPT FLUSH 為止
    • 語法:SCRIPT LOAD script
    • 返回:腳本的 SHA1 校驗和
  • SCRIPT EXISTS:校驗指定的腳本是否已經被保存在緩存當中
    • 語法:SCRIPT EXISTS sha1 [sha1 ...]
  • SCRIPT FLUSH:清除 Redis 服務端所有 lua 腳本緩存
  • SCRIPT KILL用于殺死當前正在運行的 lua 腳本,當且僅當這個腳本沒有執(zhí)行過任何寫操作時,這個命令才生效。這個命令主要用于終止運行時間過長的腳本,比如一個因為 BUG 而發(fā)生無限循環(huán)的腳本

案例:

redis 127.0.0.1:6379> SCRIPT LOAD "return 'hello moto'"    # 載入一個腳本
"232fd51614574cf0867b83d384a5e898cfd24e5a"

redis 127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 1

redis 127.0.0.1:6379> SCRIPT FLUSH     # 清空緩存
OK

redis 127.0.0.1:6379> SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 0

2. 具體業(yè)務使用案例

基于 Redis 的分布式鎖

釋放鎖的流程:

  1. 獲取鎖中的線程標識
  2. 判斷是否與指定的標識(當前線程標識)一致
  3. 如果一致,則刪除;否則,什么都不做

unlock.lua 如下:resources/unlock.lua

-- 比較線程標示與鎖中的標示是否一致
if(redis.call('get', KEYS[1]) ==  ARGV[1]) then
    -- 釋放鎖 del key
    return redis.call('del', KEYS[1])
end
return 0

在 Java 中調用:文章來源地址http://www.zghlxwxcb.cn/news/detail-730379.html

// 初始化 lua 腳本文件
private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;
static {
    UNLOCK_SCRIPT = new DefaultRedisScript<>();
    //lua腳本位置
    UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
    //返回值類型
    UNLOCK_SCRIPT.setResultType(Long.class);
}

// 使用 lua 腳本釋放鎖
public void unlock(String lockKey,String lockValue){
    // 調用lua腳本
    redisTemplate.execute(
            UNLOCK_SCRIPT,
            Collections.singletonList(lockKey),
            lockValue);
}

到了這里,關于【Redis】Redis 的學習教程(十二)之在 Redis使用 lua 腳本的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【深度學習】Pytorch 系列教程(十二):PyTorch數據結構:4、數據集(Dataset)

    ???????? 目錄 一、前言 二、實驗環(huán)境 三、PyTorch數據結構 0、分類 1、張量(Tensor) 2、張量操作(Tensor Operations) 3、變量(Variable) 4、數據集(Dataset) 隨機洗牌 ? ? ? ? ? ChatGPT: ????????PyTorch是一個開源的機器學習框架,廣泛應用于深度學習領域。它提供了豐富

    2024年02月07日
    瀏覽(22)
  • Java生態(tài)/Redis中如何使用Lua腳本

    Java生態(tài)/Redis中如何使用Lua腳本

    Mac上安裝LUA很簡單,直接使用 brew 相關命令; 使用 lua -v 命令可以看到lua已經安裝完畢。 創(chuàng)建一個test.lua文件,內容為: 執(zhí)行命令: 輸出為: Lua 提供了交互式編程和腳本式編程: 交互式編程:直接在命令行中輸入語法,可以立即執(zhí)行并查看到執(zhí)行效果。 腳本是編程:編寫

    2024年01月20日
    瀏覽(15)
  • Spring Boot - 結合 Redis 使用 Lua腳本

    在Spring Boot中整合Redis并使用Lua腳本: 添加Spring Boot和Redis的依賴: 首先,在Spring Boot項目的 pom.xml 文件中添加Spring Boot和Spring Data Redis的依賴: 配置Redis連接: 在 application.properties 或 application.yml 中配置Redis的連接信息,以及 redis 配置: RedisConfig.java

    2024年02月08日
    瀏覽(20)
  • lua腳本的基本語法,以及Redis中簡單使用

    Lua 腳本的基本語法如下: 變量與賦值: 變量名可以是字母、數字和下劃線的組合,以字母或下劃線開頭。Lua 是動態(tài)類型語言,無需事先聲明變量類型。 控制結構: a) 條件語句: b) 循環(huán)語句: 函數定義: 函數可以有參數和返回值。 表(table): 表是 Lua 中的一種數據結構

    2024年02月04日
    瀏覽(19)
  • 【深度學習】 Python 和 NumPy 系列教程(十二):NumPy詳解:4、數組廣播;5、排序操作

    【深度學習】 Python 和 NumPy 系列教程(十二):NumPy詳解:4、數組廣播;5、排序操作

    目錄 一、前言 二、實驗環(huán)境 三、NumPy 0、多維數組對象(ndarray) 多維數組的屬性 1、創(chuàng)建數組 2、數組操作 3、數組數學 4、數組廣播 5、排序操作 1. np.sort()?函數 2. np.argsort()?函數 3. ndarray.sort()?方法 4. 按列或行排序 5. np.lexsort()?函數 6. np.partition()?函數 7. np.argpartition()?函

    2024年02月08日
    瀏覽(31)
  • 【MYSQL】MYSQL 的學習教程(十二)之 MySQL 啥時候用記錄鎖,啥時候用間隙鎖

    【MYSQL】MYSQL 的學習教程(十二)之 MySQL 啥時候用記錄鎖,啥時候用間隙鎖

    在「讀未提交」和「讀已提交」隔離級別下,都只會使用 記錄鎖 ;而對于「可重復讀」隔離級別來說,會使用 記錄鎖、間隙鎖和 Next-Key 鎖 那么 MySQL 啥時候會用記錄鎖,啥時候會用間隙鎖,啥時候又會用 Next-Key 鎖呢? 影響其使用哪種行級鎖的因素有: 索引類型(聚簇索引

    2024年02月02日
    瀏覽(30)
  • 在 Redis 中使用 Lua 腳本執(zhí)行復雜操作和事務

    在 Redis 中使用 Lua 腳本執(zhí)行復雜操作和事務 Redis 作為一個高性能的鍵值存儲數據庫,它的強大功能遠不止于簡單的數據存儲和檢索。Redis 自 2.6 版本起引入了對 Lua 腳本的支持,這意味著你可以在 Redis 服務器上直接運行 Lua 腳本。這一功能為執(zhí)行復雜的操作和事務提供了強大

    2024年01月25日
    瀏覽(21)
  • 在Springboot項目中使用Redis提供給Lua的腳本

    在Spring Boot項目中,你可以使用RedisTemplate來執(zhí)行Lua腳本。RedisTemplate是Spring Data Redis提供的一個Redis客戶端,它可以方便地與Redis進行交互。以下是使用RedisTemplate執(zhí)行Lua腳本的一般步驟: 添加Spring Data Redis依賴: 首先,確保你的Spring Boot項目中已經添加了Spring Data Redis依賴。你可

    2024年02月07日
    瀏覽(20)
  • 【Redis】Redis 的學習教程(一)入門基礎

    【Redis】Redis 的學習教程(一)入門基礎

    Redis 全稱: Remote Dictionary Server(遠程字典服務器) ,是一款開源的,遵守 BSD 協(xié)議,使用 C 語言開發(fā)的 key-value 存儲系統(tǒng)。簡單的說,它是一款跨平臺的非關系型數據庫,支持優(yōu)先內存存儲, 并提供多種語言的 API 客戶端 雖然開源軟件市場上也有很多優(yōu)秀的緩存服務中間件,

    2024年02月12日
    瀏覽(31)
  • Redis 讀寫分離 使用redisTemplate執(zhí)行l(wèi)ua腳本時,報錯處理

    Redis 讀寫分離 使用redisTemplate執(zhí)行l(wèi)ua腳本時,報錯處理

    項目配置 redis架構 1主2從3哨兵模式 采用了讀寫分離模式 springboot使用 luttuce 項目使用redisTemplate執(zhí)行l(wèi)ua腳本 測試代碼 大致意思是說 在從節(jié)點上執(zhí)行 寫操作(實際上寫操作是在lua腳本里面的) 為什么執(zhí)行l(wèi)ua腳本會只走從節(jié)點? 在主從模式下,框架自身應該是可以區(qū)分讀和寫

    2024年02月17日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包