当前位置:首页 > 科技  > 软件

深入理解 Redis Lua 脚本调试技巧和最佳实践

来源: 责编: 时间:2024-01-10 09:36:25 376观看
导读Redis Lua 脚本调试是一种强大的工具,可以帮助您快速发现和解决Lua脚本中的问题。它允许您在运行脚本时逐步执行脚本,并检查每个步骤的结果。两种调试模式从Redis 3.2开始,内置了 Lua debugger(简称LDB),使用Lua debugger可

Redis Lua 脚本调试是一种强大的工具,可以帮助您快速发现和解决Lua脚本中的问题。它允许您在运行脚本时逐步执行脚本,并检查每个步骤的结果。PVj28资讯网——每日最新资讯28at.com

两种调试模式

从Redis 3.2开始,内置了 Lua debugger(简称LDB),使用Lua debugger可以很方便的对我们编写的Lua脚本进行调试PVj28资讯网——每日最新资讯28at.com

异步模式 --ldb

开启 lua dubegger ,将会进入debug命令行。这个模式下 redis 会 fork 一个进程进入隔离环境,不会影响 redis 正常提供服务,但调试期间,原始 redis 执行命令、脚本的结果也不会体现到 fork 之后的隔离环境之中PVj28资讯网——每日最新资讯28at.com

同步模式 --ldb-sync-mode

同步模式,这个模式下,会阻塞 redis 上所有的命令、脚本,直到脚本退出,完全模拟了正式环境使用时候的情况,使用的时候务必注意这点。PVj28资讯网——每日最新资讯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 脚本PVj28资讯网——每日最新资讯28at.com

local foo = redis.call('ping')return foo
运行截图

图片图片PVj28资讯网——每日最新资讯28at.com

案例2、携带参数的脚本执行

demo1.luaPVj28资讯网——每日最新资讯28at.com

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

图片图片PVj28资讯网——每日最新资讯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)
准备数据

图片图片PVj28资讯网——每日最新资讯28at.com

执行结果

图片图片PVj28资讯网——每日最新资讯28at.com

注意:KEYS 和 ARGV 使用 , 逗号分隔PVj28资讯网——每日最新资讯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可以退出调试模式

图片图片PVj28资讯网——每日最新资讯28at.com

如果移除代码 count = count - 1 ,则会进入系循环PVj28资讯网——每日最新资讯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) 命令,显示所有代码,看看需要在哪一行打断点

图片图片PVj28资讯网——每日最新资讯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

图片图片PVj28资讯网——每日最新资讯28at.com

  1. 我们需要直接运行到打断点的地方,则需要输入:c 命令,会直接跳转到打第一个断点的语句,这时候可以打印断点之前的 变量,以下可以看出运行结果:

图片图片PVj28资讯网——每日最新资讯28at.com

  1. 命令 b 0 删除所有断点(这里删除后,再第9行我们在打个断点),再次输入 b,发现已经没有断点。并且断点后面的值没法打印,只能打断点之前的变量

图片图片PVj28资讯网——每日最新资讯28at.com

  1. 第 9 行打断点(b 9 ),查看所有代码,第9行已经被打伤断点了

图片图片PVj28资讯网——每日最新资讯28at.com

  1. 再次跳转(c 命令)到打断点的地方。再次打印变量,发现已经可以打印了

图片图片PVj28资讯网——每日最新资讯28at.com

  1. print 打印所有变量

图片图片PVj28资讯网——每日最新资讯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不存在,则返回nonePVj28资讯网——每日最新资讯28at.com

如果该key存在,则返回该key数据结构类型,如上返回 zset,表示有序集合。PVj28资讯网——每日最新资讯28at.com

  • unpack() 函数:unpack它接受一个数组(table)作为参数,并默认从下标1开始返回数组的所有元素
  • 移除有序集中的一个或多个成员 ZREM key member [member ...]
  • 获取多个字段的hash值数组HMGET key field [field ...]
  • 删除hash值的key HDEL key field [field ...]

图片图片PVj28资讯网——每日最新资讯28at.com

  • b 27 ,b 28 打两个端点
  • c 命令直接到第一个端点(b 26)
  • p 打印之前所有的变量

重要: 以上消费者脚本会直接删除有序集合key和所对应的哈希值。所以为了消息的可靠性。通过以上脚本返回的值会存储在一个stream流中,如果在stream消费失败(没有进行ACK机制),则会进入待办Pending队列重复消费(知道ACK机制或者删除该消息队列)PVj28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-59690-0.html深入理解 Redis Lua 脚本调试技巧和最佳实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 浅析五种 React 组件设计模式

下一篇: 大模型应用助力大学生备考提效 夸克 App 上线“AI 学习助手”

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • iPhone卖不动了!苹果股价创年内最大日跌幅:市值一夜蒸发万亿元

    8月5日消息,今天凌晨美股三大指数高开低走集体收跌,道指跌0.41%;纳指跌0.36%;标普500指数跌0.52%。热门科技股也都变化极大,其中苹果报181.99美元,跌4.8%,创
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top