当前位置: 首页 > news >正文

debug redis里面的lua脚本

2025年6月26日15:46:26

官方lua脚本文档
https://redis.io/docs/latest/develop/programmability/eval-intro/
https://redis.io/docs/latest/develop/programmability/lua-api/

windows的redis发行版
https://github.com/MicrosoftArchive/redis/releases

windows下也推荐docker版本
https://redis.io/docs/latest/operate/oss_and_stack/install/install-stack/windows/
image

注意:widnows下的redis下是没有debug的,是因为自3.2.100之后,就没有发布windows版本,只有docker版本

linux 帮助文件

# redis-cli --help
redis-cli 8.0.2用法:redis-cli [选项] [命令 [参数 [参数 ...]]]-h <hostname>      服务器主机名(默认:127.0.0.1)。-p <port>          服务器端口(默认:6379)。-t <timeout>       服务器连接超时时间(秒,允许小数)。默认超时为 0,即无限制(取决于操作系统)。-s <socket>        服务器套接字(覆盖主机名和端口)。-a <password>      连接服务器时使用的密码。也可使用 REDISCLI_AUTH 环境变量更安全地传递密码(若两者都使用,此参数优先)。--user <username>  用于发送 ACL 风格的 'AUTH username pass'。需配合 -a 使用。--pass <password>  -a 的别名,为与新的 --user 选项保持一致性。--askpass          强制用户从标准输入输入带掩码的密码。若使用此参数,'-a' 和 REDISCLI_AUTH 环境变量将被忽略。-u <uri>           服务器 URI,格式为 redis://user:password@host:port/dbnum用户、密码和 dbnum 为可选。无用户名认证时,使用用户名 'default'。对于 TLS,使用协议 'rediss'。-r <repeat>        执行指定命令 N 次。-i <interval>      当使用 -r 时,每个命令间隔 <interval> 秒。可指定亚秒级时间,如 -i 0.1。此间隔也用于 --scan 和 --stat 的每个周期,以及 --bigkeys、--memkeys、--keystats 和 --hotkeys 的每 100 个周期。-n <db>            数据库编号。-2                 以 RESP2 协议模式启动会话。-3                 以 RESP3 协议模式启动会话。-x                 从标准输入读取最后一个参数(见下方示例)。-X                 从标准输入读取 <tag> 参数(见下方示例)。-d <delimiter>     原始格式下响应块之间的分隔符(默认:\n)。-D <delimiter>     原始格式下响应之间的分隔符(默认:\n)。-c                 启用集群模式(跟随 -ASK 和 -MOVED 重定向)。-e                 当命令执行失败时返回退出错误码。-4                 DNS 查找时优先使用 IPv4 而非 IPv6。-6                 DNS 查找时优先使用 IPv6 而非 IPv4。--tls              建立安全的 TLS 连接。--sni <host>       TLS 的服务器名称指示。--cacert <file>    用于验证的 CA 证书文件。--cacertdir <dir>  存储可信 CA 证书的目录。若未指定 cacert 或 cacertdir,将应用系统默认的可信根证书配置。--insecure         允许不安全的 TLS 连接(跳过证书验证)。--cert <file>      用于认证的客户端证书。--key <file>       用于认证的私钥文件。--tls-ciphers <list> 设置首选密码套件列表(TLSv1.2 及以下),按优先级从高到低用冒号(":")分隔。有关此字符串语法的更多信息,请参阅 ciphers(1ssl) 手册页。--tls-ciphersuites <list> 设置首选密码套件列表(TLSv1.3),按优先级从高到低用冒号(":")分隔。有关此字符串语法的更多信息,请参阅 ciphers(1ssl) 手册页,特别是 TLSv1.3 密码套件部分。--raw              使用原始格式输出响应(当标准输出不是终端时默认启用)。--no-raw           强制格式化输出,即使标准输出不是终端。--quoted-input     强制将输入视为带引号的字符串。--csv              以 CSV 格式输出。--json             以 JSON 格式输出(默认使用 RESP3 协议,若要使用 RESP2,需配合 -2)。--quoted-json      与 --json 相同,但生成 ASCII 安全的带引号字符串(而非 Unicode)。--show-pushes <yn> 是否打印 RESP3 PUSH 消息。当标准输出是终端时默认启用,可通过 --show-pushes no 覆盖。--stat             打印服务器的滚动统计信息:内存、客户端等。--latency          进入特殊模式,持续采样延迟。若在交互式会话中使用此模式,将永久运行并显示实时统计。否则,若指定了 --raw 或 --csv,或输出重定向到非终端,将采样延迟 1 秒(可使用 -i 更改间隔),然后生成单次输出并退出。--latency-history  类似 --latency,但跟踪延迟随时间的变化。默认时间间隔为 15 秒。可使用 -i 更改。--latency-dist     以频谱形式显示延迟,需要支持 256 色的 xterm。默认时间间隔为 1 秒。可使用 -i 更改。--lru-test <keys>  模拟 80-20 分布的缓存工作负载。--replica          模拟从节点,显示从主节点接收的命令。--rdb <filename>   将远程服务器的 RDB  dump 传输到本地文件。文件名使用 "-" 表示写入标准输出。--functions-rdb <filename> 类似 --rdb,但获取 RDB dump 文件时仅包含函数(不含键)。--pipe             将标准输入的原始 Redis 协议传输到服务器。--pipe-timeout <n> 在 --pipe 模式下,发送所有数据后若在 <n> 秒内未收到回复,则报错中止。默认超时:30 秒。使用 0 表示无限等待。--bigkeys          采样 Redis 键,查找包含大量元素(复杂度高)的键。--memkeys          采样 Redis 键,查找消耗大量内存的键。--memkeys-samples <n> 采样 Redis 键,查找消耗大量内存的键,并指定要采样的键元素数量。--keystats         采样 Redis 键,查找键的内存大小和长度(结合 bigkeys 和 memkeys)。--keystats-samples <n> 采样 Redis 键,查找键的内存大小和长度,并指定要采样的键元素数量(仅用于内存使用)。--cursor <n>       从游标 <n> 开始扫描(通常在 Ctrl-C 之后)。可配合 --keystats 和 --keystats-samples 使用。--top <n>          显示 <n> 个最大的键大小(默认:10)。可配合 --keystats 和 --keystats-samples 使用。--hotkeys          采样 Redis 键,查找热点键。仅当 maxmemory-policy 为 *lfu 时有效。--scan             使用 SCAN 命令列出所有键。--pattern <pat>    使用 --scan、--bigkeys、--memkeys、--keystats 或 --hotkeys 时的键模式(默认:*)。--count <count>    使用 --scan、--bigkeys、--memkeys、--keystats 或 --hotkeys 时的 count 选项(默认:10)。--quoted-pattern <pat> 与 --pattern 相同,但指定的字符串可被引用,以便传递原本非二进制安全的字符串。--intrinsic-latency <sec> 运行测试以测量系统固有延迟。测试将运行指定的秒数。--eval <file>      使用 <file> 中的 Lua 脚本发送 EVAL 命令。--ldb              与 --eval 配合使用,启用 Redis Lua 调试器。--ldb-sync-mode    类似 --ldb,但使用同步 Lua 调试器,在此模式下服务器会被阻塞,且脚本更改不会从服务器内存中回滚。--cluster <command> [args...] [opts...]集群管理命令和参数(见下文)。--verbose          详细模式。--no-auth-warning  在命令行界面使用密码时不显示警告信息。--help             输出此帮助信息并退出。--version          输出版本信息并退出。集群管理命令:使用 --cluster help 列出所有可用的集群管理命令。示例:redis-cli -u redis://default:PASSWORD@localhost:6379/0cat /etc/passwd | redis-cli -x set mypasswdredis-cli -D "" --raw dump key > key.dump && redis-cli -X dump_tag restore key2 0 dump_tag replace < key.dumpredis-cli -r 100 lpush mylist xredis-cli -r 100 -i 1 info | grep used_memory_human:redis-cli --quoted-input set '"null-\x00-separated"' valueredis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3redis-cli --scan --pattern '*:12345*'redis-cli --scan --pattern '*:12345*' --count 100(注意:使用 --eval 时,逗号用于分隔 KEYS[] 和 ARGV[] 参数)当未指定命令时,redis-cli 以交互模式启动。
在交互模式下输入 "help" 可获取可用命令和设置的信息。
同步模式(阻塞整个 Redis 服务,慎用) 某些特殊场景
redis-cli --ldb-sync-mode --eval your_script.lua key1 key2 , arg1 arg2
启动调试(非阻塞模式,不影响生产环境)
redis-cli --ldb --eval your_script.lua key1 key2 , arg1 arg2# redis-cli --ldb --eval 1.lua
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 zKey = 'bt:order:xxxx'; lua debugger> help
Redis Lua 调试器帮助:
[h] help 显示此帮助信息。
[s] step 执行当前行并再次暂停。
[n] next step 的别名。
[c] continue 运行到下一个断点。
[l] list 列出当前行附近的源代码。
[l] list [line] 列出 [line] 附近的源代码。
line = 0 表示:当前位置。
[l] list [line] [ctx] 在此形式中,[ctx] 指定显示 [line] 前后的行数。
[w] whole 列出所有源代码。相当于 'list 1 1000000' 的别名。
[p] print 显示所有局部变量。
[p] print <var> 显示指定变量的值。
也可以显示全局变量 KEYS 和 ARGV。
[b] break 显示所有断点。
[b] break <line> 在指定行添加断点。
[b] break -<line> 从指定行移除断点。
[b] break 0 移除所有断点。
[t] trace 显示调用栈追踪。
[e] eval <code> 执行一些 Lua 代码(在不同的调用帧中)。
[r] redis <cmd> 执行一条 Redis 命令。
[m] maxlen [len] 将记录的 Redis 回复和 Lua 变量 dump 截断到 len 长度。
指定 <len> 为 0 表示无限制。
[a] abort 停止脚本执行。在同步模式下,数据集的更改将被保留。可从 Lua 脚本中调用的调试器函数:
redis.debug () 在调试器控制台中生成日志。
redis.breakpoint () 停止执行,就像下一行代码有一个断点一样。
lua debugger>使用举例
/*
* 注意:这里所有的参数带到lua里面的时候,都会带 REDIS_PREFIX的前缀,这里的lua脚本不好debug,没事不要随便改5 代表 参数数量
*/$res = Redis::eval($script, 5, $zKey, $hKeyPrefix, $start, $end, $delScore);$script = <<<LUA
local zkey = tostring(KEYS[1])
local hKeyPrefix = tostring(KEYS[2])
local startName = string.gsub(KEYS[3], "bt:", "");
local endName = string.gsub(KEYS[4], "bt:", "");
local delScore = string.gsub(KEYS[5], "bt:", "");
--local result = { zkey, hKeyPrefix,startName, endName, delScore }
local result = {}LUA;

注意,laravel的Redis::eval方法会把一些前缀带进去

推荐debug redis lua脚本方案:
1,拉docker的redis版本,不要使用widnwos的3.x的版本太低了,没有 debug分析器
2,建议直接把参数写入到lua脚本里面测一下,不建议使用:redis-cli --ldb --eval your_script.lua key1 key2 , arg1 arg2
3,可以 local result = { zkey, hKeyPrefix,startName, endName, delScore } return result 的方式,查看一些参数的返回值
4,因为不同语言在封装的方式不同,所以以上方式,是比较适合debug lua脚本的方式
5,如果使用的是数据不是默认db,就需要指定 db数,-n 数据库编号。例:redis-cli -n 13--ldb --eval your_script.lua

http://www.lryc.cn/news/603839.html

相关文章:

  • Spring Boot 防重放攻击全面指南:原理、方案与最佳实践
  • ElasticSearch 的3种数据迁移方案
  • 在Word和WPS文字中把全角数字全部改为半角
  • Vue2学习-MVVM模型
  • Spring Boot 简单接口角色授权检查实现
  • C++入门知识学习(上)
  • 嵌入式学习日志(十一)
  • css3之三维变换详说
  • SQL Server中的分页查询
  • leetcode热题——螺旋矩阵
  • 第十一天:不定方程求解
  • 镁金属接骨螺钉注册检测:骨科植入安全的科学基石
  • Rust基础-part8-模式匹配、常见集合
  • 亚马逊 Vine 计划:评论生态重构与合规运营策略
  • 学习笔记-中华心法问答系统的性能提升
  • 小孙学变频学习笔记(十二)机械特性的调整 机械特性的改善
  • 想要批量提取视频背景音乐?FFmpeg 和转换器都安排上
  • Day 25:异常处理
  • VTK开发笔记(一):VTK介绍,Qt5.9.3+VS2017x64+VTK8.2编译
  • Zynq SOC FPGA嵌入式裸机设计和开发教程自学笔记:GPIO扩展与中断控制技术,万字详解!!
  • 车载刷写架构 --- 整车刷写中为何增加了ECU 队列刷写策略?
  • 服务器分布式的作用都有什么?
  • Windows下基于 SenseVoice模型的本地语音转文字工具
  • Ubuntu25.04轻量虚拟机Multipass使用Shell脚本自动创建并启动不同版本Ubuntu并复制文件
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step1—基础环境准备
  • GaussDB 约束的语法
  • 【LeetCode】前缀表相关算法
  • 服务器数据恢复—RAID上层部署的oracle数据库数据恢复案例
  • Node.js 是怎么一步步撼动PHP地位的
  • #C语言——学习攻略:深挖指针路线(三)--数组与指针的结合、冒泡排序