當前位置:首頁 » 編程軟體 » redislua腳本

redislua腳本

發布時間: 2022-03-02 22:38:33

① redis 執行 xxx.luaxxx.lua 腳本如何傳參數。格式是什麼

在Redis中執行Lua腳本有兩種方法:eval和evalsha
1.eval
eval 腳本內容 key個數 key列表 參數列表
如果Lua腳本較長,還可以使用redis-cli-eval直接執行文件。
客戶端如果想執行Lua腳本,首先在客戶端編寫好Lua腳本代碼,然後把腳本作為字元串發送給服務端,服務端會將執行結果返回給客戶端。
2.evalsha
將Lua腳本載入到Redis服務端,得到該腳本的sha1校驗和,evalsha命令使用sha1作為參數可以直接執行對應的Lua腳本,避免每次發送Lua腳本的開銷。這樣客戶端就不需要每次執行腳本內容,而腳本也會常駐在服務端,腳本內容得到了復用。
載入腳本: script load命令可以將腳本內容載入到Redis內存中。
lua的Redis API
lua可以使用redis.call函數實現對Redis的訪問
redis.call(「set」,」hello」,」world」)
redis.call(「get」,」hello」)
除此之外Lua還可以使用redis.pcall函數實現對Redis的調用,redis.call和redis.pcall的不同在於,如果redis.call執行失敗,那麼腳本執行結束會直接返回錯誤,而redis.pcall會忽略錯誤繼續執行腳本。
Lua腳本功能為Redis開發和運維人員帶來的如下三個好處:
1.Lua腳本在Redis中是原子執行的,執行過程中間不會插入其他命令。
2.Lua腳本可以幫助開發和運維人員創造出自己定製的命令,並可以將這些命令常駐在Redis內存中,實現復用的效果。
3.Lua腳本可以將多條命令一次性打包,有效地減少網路開銷。
Redis如何管理Lua腳本
1.script load
此命令用於將Lua腳本載入到Redis內存中
2.script exists
scripts exists sha1 [sha1 …]
此命令用於判斷sha1是否已經載入到Redis內存中
3.script flush
此命令用於清除Redis內存已經載入的所有Lua腳本,在執行script flush後,sha1不復存在。
4.script kill

② redis執行lua腳本的時候會不會刪除過期鍵

生命周期為一天,現在執行lua腳本,邏輯是判斷a是否存在,存在則往其中添加其它的元素

③ 為什麼在 Redis 實現 Lua 腳本事務

數據完整性

從很多方面來看,Redis 很像當初採用 InnoDB 前的 MySQL。而 Redis 採用了一種很合理的方式來保證數據完整性(復制,AOF 等),並且從 Redis2.6 開始引入的 Lua 腳本在功能與易用性方面為 Redis 的成長提供了很大助力。

相對來說,Lua 腳本與其他資料庫中的存儲過程很相似,但腳本的執行有些許不同。在本文中最重要的一點就是一旦將腳本寫入資料庫,它會一直執行直到以下任一種情況出現:

1. 完成所有工作,所有寫操作處理完成後腳本會自動退出。

2. 腳本運行時出錯並中途退出,所有以前執行的寫操作都已發生,但不會再有其他寫操作。

3. Redis 通過 SHUTDOWN NOSAVE 關閉時(不保存)。

4. 你附加了調試器來「使」腳本完成 #1 與 #2 (或其他手段來保證不會丟失數據)。

對於使用資料庫開發軟體的人,我想你也認同只有情景 #1 是最理想的。情景 #2,#3,#4 都會導致數據異常(#2 與
#4)和/或數據丟失(#3 和 #4)。如果你很重視數據,你應該盡可能地阻止數據異常與丟失。這不是哲學,而是工作(This is not
philosophy, this is doing your job)。但很遺憾目前的 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」錯誤

⑤ jediscluster怎麼使用lua腳本

Jedis使用總結 前段時間細節的了解了Jedis的使用,Jedis是redis的java版本的客戶端實現。 本文做個總結,主要分享如下內容: 【pipeline】【分布式的id生成器】【分布式鎖【watch】【multi】】【redis分布式】 好了,一個一個來。 一、 Pipeline。

⑥ redis lua腳本有什麼用

主要用途是: (1)描述界面:WOW和劍網三的界面都是用LUA寫的; (2)溝通引擎:游戲圖形引擎提供了一些介面庫,可以在LUA中調用; (3)伺服器端:有些游戲,例如劍網三,在伺服器端也會大量使用LUA。

⑦ redis載入lua腳本,怎麼獲取數據

需要用lua寫redis的操作函數,先連接redis資料庫,然後執行命令,來獲取數據。

⑧ 用lua 給redis 中塞值要怎麼設置有效時間

不存在現成的方法

如果要實現你說的功能
一般來說 還是按照正常的方法通過insert 或remove對表進行值的增減
然後再額外的對表進行一個監聽 當達到規定時間的時候,remove掉相關的值

熱點內容
javasocket讀取 發布:2025-01-19 16:59:48 瀏覽:336
魅族路由器在哪裡設置密碼 發布:2025-01-19 16:59:45 瀏覽:657
經濟與發展資料庫 發布:2025-01-19 16:59:44 瀏覽:727
出國訪問奪權 發布:2025-01-19 16:57:22 瀏覽:591
vb打開共享文件夾 發布:2025-01-19 16:57:11 瀏覽:484
怎麼查詢手機wifi密碼 發布:2025-01-19 16:41:31 瀏覽:187
linux編輯圖片 發布:2025-01-19 16:37:55 瀏覽:167
sql數據對比 發布:2025-01-19 16:32:09 瀏覽:232
magnet下載ftp 發布:2025-01-19 16:27:07 瀏覽:318
注冊密碼下劃線是什麼意思 發布:2025-01-19 16:23:58 瀏覽:806