當前位置:編程學習大全網 - 源碼下載 - redis有腳本語言嗎

redis有腳本語言嗎

有,lua腳本語言

Redis腳本

使用腳本的好處:

減少網絡開銷。可以將多個請求通過腳本的形式壹次發送,減少網絡時延

原子操作。redis會將整個腳本作為壹個整體執行,中間不會被其他命令插入。因此在編寫腳本的過程中無需擔心會出現競態條件,無需使用事務。

復用。客戶端發送的腳步會永久存在redis中,這樣,其他客戶端可以復用這壹腳本而不需要使用代碼完成相同的邏輯。

調用Lua腳本的語法:

$ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...

--eval,告訴redis-cli讀取並運行後面的lua腳本

path/to/redis.lua,是lua腳本的位置

KEYS[1] KEYS[2],是要操作的鍵,可以指定多個,在lua腳本中通過KEYS[1], KEYS[2]獲取

ARGV[1] ARGV[2],參數,在lua腳本中通過ARGV[1], ARGV[2]獲取。

註意:

KEYS和ARGV中間的 ',' 兩邊的空格,不能省略。

redis支持大部分Lua標準庫

庫名

說明

Base 提供壹些基礎函數

String 提供用於字符串操作的函數

Table 提供用於表操作的函數

Math 提供數學計算函數

Debug 提供用於調試的函數

在腳本中調用redis命令

在腳本中可以使用redis.call函數調用Redis命令

redis.call('set', 'foo', 'bar')local value=redis.call('get', 'foo') --value的值為bar

redis.call函數的返回值就是Redis命令的執行結果

Redis命令的返回值有5種類型,redis.call函數會將這5種類型的回復轉換成對應的Lua的數據類型,具體的對應規則如下(空結果比較特殊,其對應Lua的false)

redis返回值類型和Lua數據類型轉換規則

redis返回值類型

Lua數據類型

整數回復 數字類型

字符串回復 字符串類型

多行字符串回復 table類型(數組形式)

狀態回復 table類型(只有壹個ok字段存儲狀態信息)

錯誤回復 table類型(只有壹個err字段存儲錯誤信息)

redis還提供了redis.pcall函數,功能與redis.call相同,唯壹的區別是當命令執行出錯時,redis.pcall會記錄錯誤並繼續執行,而redis.call會直接返回錯誤,不會繼續執行。

在腳本中可以使用return語句將值返回給客戶端,如果沒有執行return語句則默認返回nil

Lua數據類型和redis返回值類型轉換規則

Lua數據類型

redis返回值類型

數字類型 整數回復(Lua的數字類型會被自動轉換成整數)

字符串類型 字符串回復

table類型(數組形式) 多行字符串回復

table類型(只有壹個ok字段存儲狀態信息) 狀態回復

table類型(只有壹個err字段存儲錯誤信息) 錯誤回復

腳本相關命令

EVAL "lua-script" [key ...] [arg ...]

通過key和arg這兩類參數向腳本傳遞數據,它們的值在腳本中分別使用KEYS和ARGV兩個表類型的全局變量訪問。

註意: EVAL命令依據參數key-number來將其後面的所有參數分別存入腳本中KEYS和ARGV兩個table類型的全局變量。當腳本不需要任何參數時,也不能省略這個參數(設為0)

redis>EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 foo bar

OK

redis>GET foo"bar"

EVALSHA命令

在腳本比較長的情況下,如果每次調用腳本都需要將整個腳本傳給Redis會占用較多的帶寬。為了解決這個問題,Redis提供了EVALSHA命令,允許開發者通過腳本內容的SHA1摘要來執行腳本,該命令的用法和EVAL壹樣,只不過是將腳本內容替換成腳本內容的SHA1摘要。

Redis在執行EVAL命令時會計算腳本的SHA1摘要並記錄在腳本緩存中,執行EVALSHA命令時Redis會根據提供的摘要從腳本緩存中查找對應的腳本內容,如果找到了則執行腳本,否則會返回錯誤:"NOSCRIPT No matching script. Please use EVAL."

在程序中使用EVALSHA命令的壹般流程如下。

雖然這壹流程略顯麻煩,但值得慶幸的是很多編程語言的Redis客戶端都會代替開發者完成這壹流程。執行EVAL命令時,先嘗試執行EVALSHA命令,如果失敗了才會執行EVAL命令。

先計算腳本的SHA1摘要,並使用EVALSHA命令執行腳本。

獲得返回值,如果返回“NOSCRIPT”錯誤則使用EVAL命令重新執行腳本。

SCRIPTLOAD "lua-script"

將腳本加入緩存,但不執行. 返回:腳本的SHA1摘要

SCRIPT EXISTS lua-script-sha1

判斷腳本是否已被緩存

SCRIPT FLUSH

清空腳本緩存 redis將腳本的SHA1摘要加入到腳本緩存後會永久保留,不會刪除,但可以手動使用SCRIPT FLUSH命令情況腳本緩存。

SCRIPT KILL

強制終止當前腳本的執行。 但是,如果當前執行的腳步對redis的數據進行了寫操作,則SCRIPT KILL命令不會終止腳本的運行,以防止腳本只執行了壹部分。腳本中的所有命令,要麽都執行,要麽都不執行。

Redis的腳本執行是原子的,即腳本執行期間Redis不會執行其他命令。所有的命令都必須等待腳本執行完成後才能執行。為了防止某個腳本執行時間過長導致Redis無法提供服務(比如陷入死循環),Redis提供了lua-time-limit參數限制腳本的最長運行時間,默認為5秒鐘。當腳本運行時間超過這壹限制後,Redis將開始接受其他命令但不會執行(以確保腳本的原子性,因為此時腳本並沒有被終止),而是會返回“BUSY”錯誤

  • 上一篇:jquery和javascript有什麽區別?
  • 下一篇:如何設置系統自動鎖機
  • copyright 2024編程學習大全網