日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

深入理解 Redis Lua 腳本調試技巧和最佳實踐

來源: 責編: 時間:2024-01-10 09:36:25 265觀看
導讀Redis Lua 腳本調試是一種強大的工具,可以幫助您快速發現和解決Lua腳本中的問題。它允許您在運行腳本時逐步執行腳本,并檢查每個步驟的結果。兩種調試模式從Redis 3.2開始,內置了 Lua debugger(簡稱LDB),使用Lua debugger可

Redis Lua 腳本調試是一種強大的工具,可以幫助您快速發現和解決Lua腳本中的問題。它允許您在運行腳本時逐步執行腳本,并檢查每個步驟的結果。fXE28資訊網——每日最新資訊28at.com

兩種調試模式

從Redis 3.2開始,內置了 Lua debugger(簡稱LDB),使用Lua debugger可以很方便的對我們編寫的Lua腳本進行調試fXE28資訊網——每日最新資訊28at.com

異步模式 --ldb

開啟 lua dubegger ,將會進入debug命令行。這個模式下 redis 會 fork 一個進程進入隔離環境,不會影響 redis 正常提供服務,但調試期間,原始 redis 執行命令、腳本的結果也不會體現到 fork 之后的隔離環境之中fXE28資訊網——每日最新資訊28at.com

同步模式 --ldb-sync-mode

同步模式,這個模式下,會阻塞 redis 上所有的命令、腳本,直到腳本退出,完全模擬了正式環境使用時候的情況,使用的時候務必注意這點。fXE28資訊網——每日最新資訊28at.com

參考案例
/data/lua # redis-cli -a 123456 --ldb --eval /data/lua/pong.luaWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.Lua debugging session started, please use:quit    -- End the session.restart -- Restart the script in debug mode again.help    -- Show Lua script debugging commands.* Stopped at 1, stop reason = step over-> 1   local foo = redis.call('ping') lua debugger>
  • -a 123456 Redis 登錄密碼
  • --ldb 異步模式
  • --eval 運行一個腳本
  • help 可以查看更多幫助信息

Lua 腳本

案例1、執行一條命令

pong.lua 腳本fXE28資訊網——每日最新資訊28at.com

local foo = redis.call('ping')return foo
運行截圖

圖片圖片fXE28資訊網——每日最新資訊28at.com

案例2、攜帶參數的腳本執行

demo1.luafXE28資訊網——每日最新資訊28at.com

local src = KEYS[1]local dst = KEYS[2]local count = tonumber(ARGV[1])return true
運行截圖

圖片圖片fXE28資訊網——每日最新資訊28at.com

打印所有的KEYS
lua debugger> print KEYS<value> {"list_a"; "list_b"; "10"}
打印所有的ARGV
lua debugger> print ARGV<value> {"10"}

案例3、腳本中執行 Redis 命令

demo2.lua
local src = KEYS[1]local dst = KEYS[2]local count = tonumber(ARGV[1])-- 移除 list_a 列表的最后一個元素,返回值為移除的元素,即:elocal item = redis.call('rpop', src)-- 將 e 值插入到 list_b 列表表頭部redis.call('lpush', dst, item)-- 返回 list_b 列表長度return redis.call('llen', dst)
準備數據

圖片圖片fXE28資訊網——每日最新資訊28at.com

執行結果

圖片圖片fXE28資訊網——每日最新資訊28at.com

注意:KEYS 和 ARGV 使用 , 逗號分隔fXE28資訊網——每日最新資訊28at.com

  • r 調試命令可以 執行redis命令,在調試環境里
  • redis.call("redis command") 函數執行Redis 命令
  • print 可以打印腳本中的變量

案例4、腳本中執行 Redis 命令

demo3.lua
local src = KEYS[1]local dst = KEYS[2]local count = tonumber(ARGV[1])while count > 0 do    local item = redis.call('rpop', src)    redis.debug("value of item: ",item);    if item ~= false then        redis.call('lpush', dst, item)    end   count = count - 1    endreturn redis.call('llen', dst)
  • redis.debug() 函數打印變量信息,配置 c 調試命令,可以一次性輸出所有值
  • restart 修改lua腳本后,執行該命令可以重新開始調試
  • quit可以退出調試模式

圖片圖片fXE28資訊網——每日最新資訊28at.com

如果移除代碼 count = count - 1 ,則會進入系循環fXE28資訊網——每日最新資訊28at.com

案例5、多個命令執行

demo4.lua
local src = KEYS[1]local dst = KEYS[2]local count = tonumber(ARGV[1])while count > 0 do    local username = redis.call('get',src)    redis.debug('username : ',username)    local age = redis.call('get',dst)    redis.debug('age : ',age)    count = count - 1end
  1. 使用 w(whole) 命令,顯示所有代碼,看看需要在哪一行打斷點

圖片圖片fXE28資訊網——每日最新資訊28at.com

  1. 例如要在第7行打斷點,則需要輸入 b 7
lua debugger> b 7   6       local username = redis.call('get',src)   #7       redis.debug('username : ',username)    8       local age = redis.call('get',dst)
  1. 查看所有斷點,輸入命令:b

圖片圖片fXE28資訊網——每日最新資訊28at.com

  1. 我們需要直接運行到打斷點的地方,則需要輸入:c 命令,會直接跳轉到打第一個斷點的語句,這時候可以打印斷點之前的 變量,以下可以看出運行結果:

圖片圖片fXE28資訊網——每日最新資訊28at.com

  1. 命令 b 0 刪除所有斷點(這里刪除后,再第9行我們在打個斷點),再次輸入 b,發現已經沒有斷點。并且斷點后面的值沒法打印,只能打斷點之前的變量

圖片圖片fXE28資訊網——每日最新資訊28at.com

  1. 第 9 行打斷點(b 9 ),查看所有代碼,第9行已經被打傷斷點了

圖片圖片fXE28資訊網——每日最新資訊28at.com

  1. 再次跳轉(c 命令)到打斷點的地方。再次打印變量,發現已經可以打印了

圖片圖片fXE28資訊網——每日最新資訊28at.com

  1. print 打印所有變量

圖片圖片fXE28資訊網——每日最新資訊28at.com

案例6、Redis lua 版本和函數

Redis Lua腳本是 5.1.5
-- Copyright (C) ShaoBo Wan (Tinywan)local KEYS1 = KEYS[1]local KEYS2 = KEYS[2]local ARGV1 = ARGV[1]local ARGV2 = ARGV[2]local ARGV3 = ARGV[3]local ARGV4 = ARGV[4]local status, type = next(redis.call('TYPE', KEYS[1])) -- type=none status=ok if status ~= nil and status == 'ok' then    if type == 'zset' then        -- list = {"10090"; "10089"; "10088"; "10087"; "10086"}        local list = redis.call('ZREVRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[2], 'LIMIT', ARGV[3], ARGV[4])        -- 獲取數組table長度:#list        local kk = #list        -- unpack它接受一個數組(table)作為參數,并默認從下標1開始返回數組的所有元素        local k1, k2, k3, k4 ,k5 = unpack(list)        redis.debug('k1 ', k1) -- 10090        redis.debug('k2 ', k2) -- 10089        redis.debug('k3 ', k3) -- 10088        redis.debug('k4 ', k4) -- 10087        redis.debug('k5 ', k5) -- 10087        if list ~= nil and #list > 0 then            -- ZREM key member [member ...]            redis.call('ZREM', KEYS[1], unpack(list)) -- unpack(list) 返回過期數組的所有元素            -- HMGET key field [field ...]            local result = redis.call('HMGET', KEYS[2], unpack(list)) -- ["username:Tinywan,age:24"]            -- HDEL key field [field ...]            redis.call('HDEL', KEYS[2], unpack(list)) -- 1            return result        end    endendreturn nil
  • next() 函數:第一個值返回函數是否執行成功(ok),第二個值返回執行結果(對應的值)>

如果該key不存在,則返回nonefXE28資訊網——每日最新資訊28at.com

如果該key存在,則返回該key數據結構類型,如上返回 zset,表示有序集合。fXE28資訊網——每日最新資訊28at.com

  • unpack() 函數:unpack它接受一個數組(table)作為參數,并默認從下標1開始返回數組的所有元素
  • 移除有序集中的一個或多個成員 ZREM key member [member ...]
  • 獲取多個字段的hash值數組HMGET key field [field ...]
  • 刪除hash值的key HDEL key field [field ...]

圖片圖片fXE28資訊網——每日最新資訊28at.com

  • b 27 ,b 28 打兩個端點
  • c 命令直接到第一個端點(b 26)
  • p 打印之前所有的變量

重要: 以上消費者腳本會直接刪除有序集合key和所對應的哈希值。所以為了消息的可靠性。通過以上腳本返回的值會存儲在一個stream流中,如果在stream消費失敗(沒有進行ACK機制),則會進入待辦Pending隊列重復消費(知道ACK機制或者刪除該消息隊列)fXE28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-59690-0.html深入理解 Redis Lua 腳本調試技巧和最佳實踐

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 淺析五種 React 組件設計模式

下一篇: 大模型應用助力大學生備考提效 夸克 App 上線“AI 學習助手”

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 吴堡县| 松滋市| 姚安县| 广宗县| 潢川县| 保亭| 曲周县| 北海市| 龙南县| 吉首市| 湖南省| 玉环县| 辉县市| 长沙县| 古丈县| 崇礼县| 新平| 电白县| 镇坪县| 凌源市| 东丽区| 光泽县| 治多县| 张家港市| 楚雄市| 文水县| 泰安市| 马龙县| 毕节市| 子洲县| 萝北县| 阜平县| 黄山市| 石狮市| 江西省| 同德县| 加查县| 东台市| 克东县| 天峨县| 汶上县|