找回密码
 立即注册
首页 业界区 安全 debug redis里面的lua脚本

debug redis里面的lua脚本

鞠古香 昨天 13:57
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/
1.png

注意:widnows下的redis下是没有debug的,是因为自3.2.100之后,就没有发布windows版本,只有docker版本
linux 帮助文件
  1. # redis-cli --help
  2. redis-cli 8.0.2
  3. 用法:redis-cli [选项] [命令 [参数 [参数 ...]]]
  4.   -h <hostname>      服务器主机名(默认:127.0.0.1)。
  5.   -p <port>          服务器端口(默认:6379)。
  6.   -t <timeout>       服务器连接超时时间(秒,允许小数)。
  7.                      默认超时为 0,即无限制(取决于操作系统)。
  8.   -s <socket>        服务器套接字(覆盖主机名和端口)。
  9.   -a <password>      连接服务器时使用的密码。
  10.                      也可使用 REDISCLI_AUTH 环境变量更安全地传递密码
  11.                      (若两者都使用,此参数优先)。
  12.   --user <username>  用于发送 ACL 风格的 'AUTH username pass'。需配合 -a 使用。
  13.   --pass <password>  -a 的别名,为与新的 --user 选项保持一致性。
  14.   --askpass          强制用户从标准输入输入带掩码的密码。
  15.                      若使用此参数,'-a' 和 REDISCLI_AUTH 环境变量将被忽略。
  16.   -u <uri>           服务器 URI,格式为 redis://user:password@host:port/dbnum
  17.                      用户、密码和 dbnum 为可选。无用户名认证时,使用用户名 'default'。
  18.                      对于 TLS,使用协议 'rediss'。
  19.   -r <repeat>        执行指定命令 N 次。
  20.   -i <interval>      当使用 -r 时,每个命令间隔 <interval> 秒。
  21.                      可指定亚秒级时间,如 -i 0.1。
  22.                      此间隔也用于 --scan 和 --stat 的每个周期,
  23.                      以及 --bigkeys、--memkeys、--keystats 和 --hotkeys 的每 100 个周期。
  24.   -n <db>            数据库编号。
  25.   -2                 以 RESP2 协议模式启动会话。
  26.   -3                 以 RESP3 协议模式启动会话。
  27.   -x                 从标准输入读取最后一个参数(见下方示例)。
  28.   -X                 从标准输入读取 <tag> 参数(见下方示例)。
  29.   -d <delimiter>     原始格式下响应块之间的分隔符(默认:\n)。
  30.   -D <delimiter>     原始格式下响应之间的分隔符(默认:\n)。
  31.   -c                 启用集群模式(跟随 -ASK 和 -MOVED 重定向)。
  32.   -e                 当命令执行失败时返回退出错误码。
  33.   -4                 DNS 查找时优先使用 IPv4 而非 IPv6。
  34.   -6                 DNS 查找时优先使用 IPv6 而非 IPv4。
  35.   --tls              建立安全的 TLS 连接。
  36.   --sni <host>       TLS 的服务器名称指示。
  37.   --cacert <file>    用于验证的 CA 证书文件。
  38.   --cacertdir <dir>  存储可信 CA 证书的目录。
  39.                      若未指定 cacert 或 cacertdir,将应用系统默认的
  40.                      可信根证书配置。
  41.   --insecure         允许不安全的 TLS 连接(跳过证书验证)。
  42.   --cert <file>      用于认证的客户端证书。
  43.   --key <file>       用于认证的私钥文件。
  44.   --tls-ciphers <list> 设置首选密码套件列表(TLSv1.2 及以下),
  45.                      按优先级从高到低用冒号(":")分隔。
  46.                      有关此字符串语法的更多信息,请参阅 ciphers(1ssl) 手册页。
  47.   --tls-ciphersuites <list> 设置首选密码套件列表(TLSv1.3),
  48.                      按优先级从高到低用冒号(":")分隔。
  49.                      有关此字符串语法的更多信息,请参阅 ciphers(1ssl) 手册页,
  50.                      特别是 TLSv1.3 密码套件部分。
  51.   --raw              使用原始格式输出响应(当标准输出不是终端时默认启用)。
  52.   --no-raw           强制格式化输出,即使标准输出不是终端。
  53.   --quoted-input     强制将输入视为带引号的字符串。
  54.   --csv              以 CSV 格式输出。
  55.   --json             以 JSON 格式输出(默认使用 RESP3 协议,若要使用 RESP2,需配合 -2)。
  56.   --quoted-json      与 --json 相同,但生成 ASCII 安全的带引号字符串(而非 Unicode)。
  57.   --show-pushes <yn> 是否打印 RESP3 PUSH 消息。当标准输出是终端时默认启用,
  58.                      可通过 --show-pushes no 覆盖。
  59.   --stat             打印服务器的滚动统计信息:内存、客户端等。
  60.   --latency          进入特殊模式,持续采样延迟。
  61.                      若在交互式会话中使用此模式,将永久运行并显示实时统计。
  62.                      否则,若指定了 --raw 或 --csv,或输出重定向到非终端,
  63.                      将采样延迟 1 秒(可使用 -i 更改间隔),然后生成单次输出并退出。
  64.   --latency-history  类似 --latency,但跟踪延迟随时间的变化。
  65.                      默认时间间隔为 15 秒。可使用 -i 更改。
  66.   --latency-dist     以频谱形式显示延迟,需要支持 256 色的 xterm。
  67.                      默认时间间隔为 1 秒。可使用 -i 更改。
  68.   --lru-test <keys>  模拟 80-20 分布的缓存工作负载。
  69.   --replica          模拟从节点,显示从主节点接收的命令。
  70.   --rdb <filename>   将远程服务器的 RDB  dump 传输到本地文件。
  71.                      文件名使用 "-" 表示写入标准输出。
  72.   --functions-rdb <filename> 类似 --rdb,但获取 RDB dump 文件时仅包含函数(不含键)。
  73.   --pipe             将标准输入的原始 Redis 协议传输到服务器。
  74.   --pipe-timeout <n> 在 --pipe 模式下,发送所有数据后若在 <n> 秒内未收到回复,
  75.                      则报错中止。
  76.                      默认超时:30 秒。使用 0 表示无限等待。
  77.   --bigkeys          采样 Redis 键,查找包含大量元素(复杂度高)的键。
  78.   --memkeys          采样 Redis 键,查找消耗大量内存的键。
  79.   --memkeys-samples <n> 采样 Redis 键,查找消耗大量内存的键,
  80.                      并指定要采样的键元素数量。
  81.   --keystats         采样 Redis 键,查找键的内存大小和长度(结合 bigkeys 和 memkeys)。
  82.   --keystats-samples <n> 采样 Redis 键,查找键的内存大小和长度,
  83.                      并指定要采样的键元素数量(仅用于内存使用)。
  84.   --cursor <n>       从游标 <n> 开始扫描(通常在 Ctrl-C 之后)。
  85.                      可配合 --keystats 和 --keystats-samples 使用。
  86.   --top <n>          显示 <n> 个最大的键大小(默认:10)。
  87.                      可配合 --keystats 和 --keystats-samples 使用。
  88.   --hotkeys          采样 Redis 键,查找热点键。
  89.                      仅当 maxmemory-policy 为 *lfu 时有效。
  90.   --scan             使用 SCAN 命令列出所有键。
  91.   --pattern <pat>    使用 --scan、--bigkeys、--memkeys、--keystats 或 --hotkeys 时的键模式
  92.                      (默认:*)。
  93.   --count <count>    使用 --scan、--bigkeys、--memkeys、--keystats 或 --hotkeys 时的 count 选项
  94.                      (默认:10)。
  95.   --quoted-pattern <pat> 与 --pattern 相同,但指定的字符串可被引用,
  96.                          以便传递原本非二进制安全的字符串。
  97.   --intrinsic-latency <sec> 运行测试以测量系统固有延迟。
  98.                      测试将运行指定的秒数。
  99.   --eval <file>      使用 <file> 中的 Lua 脚本发送 EVAL 命令。
  100.   --ldb              与 --eval 配合使用,启用 Redis Lua 调试器。
  101.   --ldb-sync-mode    类似 --ldb,但使用同步 Lua 调试器,
  102.                      在此模式下服务器会被阻塞,且脚本更改不会从服务器内存中回滚。
  103.   --cluster <command> [args...] [opts...]
  104.                      集群管理命令和参数(见下文)。
  105.   --verbose          详细模式。
  106.   --no-auth-warning  在命令行界面使用密码时不显示警告信息。
  107.   --help             输出此帮助信息并退出。
  108.   --version          输出版本信息并退出。
  109. 集群管理命令:
  110.   使用 --cluster help 列出所有可用的集群管理命令。
  111. 示例:
  112.   redis-cli -u redis://default:PASSWORD@localhost:6379/0
  113.   cat /etc/passwd | redis-cli -x set mypasswd
  114.   redis-cli -D "" --raw dump key > key.dump && redis-cli -X dump_tag restore key2 0 dump_tag replace < key.dump
  115.   redis-cli -r 100 lpush mylist x
  116.   redis-cli -r 100 -i 1 info | grep used_memory_human:
  117.   redis-cli --quoted-input set '"null-\x00-separated"' value
  118.   redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
  119.   redis-cli --scan --pattern '*:12345*'
  120.   redis-cli --scan --pattern '*:12345*' --count 100
  121.   (注意:使用 --eval 时,逗号用于分隔 KEYS[] 和 ARGV[] 参数)
  122. 当未指定命令时,redis-cli 以交互模式启动。
  123. 在交互模式下输入 "help" 可获取可用命令和设置的信息。
复制代码
同步模式(阻塞整个 Redis 服务,慎用) 某些特殊场景
  1. redis-cli --ldb-sync-mode --eval your_script.lua key1 key2 , arg1 arg2
复制代码
启动调试(非阻塞模式,不影响生产环境)
  1. redis-cli --ldb --eval your_script.lua key1 key2 , arg1 arg2
  2. # redis-cli --ldb --eval 1.lua
  3. Lua debugging session started, please use:
  4. quit    -- End the session.
  5. restart -- Restart the script in debug mode again.
  6. help    -- Show Lua script debugging commands.
  7. * Stopped at 1, stop reason = step over
  8. -> 1   local zKey = 'bt:order:xxxx';
  9. lua debugger> help
  10. Redis Lua 调试器帮助:
  11. [h] help 显示此帮助信息。
  12. [s] step 执行当前行并再次暂停。
  13. [n] next step 的别名。
  14. [c] continue 运行到下一个断点。
  15. [l] list 列出当前行附近的源代码。
  16. [l] list [line] 列出 [line] 附近的源代码。
  17. line = 0 表示:当前位置。
  18. [l] list [line] [ctx] 在此形式中,[ctx] 指定显示 [line] 前后的行数。
  19. [w] whole 列出所有源代码。相当于 'list 1 1000000' 的别名。
  20. [p] print 显示所有局部变量。
  21. [p] print <var> 显示指定变量的值。
  22. 也可以显示全局变量 KEYS 和 ARGV。
  23. [b] break 显示所有断点。
  24. [b] break <line> 在指定行添加断点。
  25. [b] break -<line> 从指定行移除断点。
  26. [b] break 0 移除所有断点。
  27. [t] trace 显示调用栈追踪。
  28. [e] eval  执行一些 Lua 代码(在不同的调用帧中)。
  29. [r] redis <cmd> 执行一条 Redis 命令。
  30. [m] maxlen [len] 将记录的 Redis 回复和 Lua 变量 dump 截断到 len 长度。
  31. 指定 <len> 为 0 表示无限制。
  32. [a] bort 停止脚本执行。在同步模式下,数据集的更改将被保留。
  33. 可从 Lua 脚本中调用的调试器函数:
  34. redis.debug () 在调试器控制台中生成日志。
  35. redis.breakpoint () 停止执行,就像下一行代码有一个断点一样。
  36. lua debugger>
  37. 使用举例
复制代码
[code]/** 注意:这里所有的参数带到lua里面的时候,都会带 REDIS_PREFIX的前缀,这里的lua脚本不好debug,没事不要随便改  5 代表 参数数量*/$res = Redis::eval($script, 5, $zKey, $hKeyPrefix, $start, $end, $delScore);$script =
您需要登录后才可以回帖 登录 | 立即注册