Redis系列七 Debug Lua

来都来了 2020-12-07 18:46:18 ⋅ 833 阅读

 

调试redis+lua

学了lua的基本语法,了解了redis+lua的配套用法,但是却不知道怎么断点调试。学就学全面点, 官网中有dubug相关说明。地址:Redis Lua scripts debugger

基础

-- script.lua
local ping = redis.call('ping')
return ping
# 执行脚本 --ldb --eval
➜  7Debug git:(main) ✗ redis-cli --ldb --eval /Users/mw/Desktop/Github/Integration/Redis/7Debug/script.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 ping = redis.call('ping')
# next
lua debugger> n
<redis> ping
<reply> "+PONG"
* Stopped at 2, stop reason = step over
# 调试位置
-> 2   return ping
# 打印lua变量
lua debugger> print ping
<value> {["ok"]="PONG"}
# next
lua debugger> n
# lua返回的结果
PONG
# 调试结束
(Lua debugging session ended -- dataset changes rolled back)
# 退出redis-cli
127.0.0.1:6379> exit
➜  7Debug git:(main) ✗ 
-- script1.lua
-- 测试接受参数
local src = KEYS[1]
local dst = KEYS[2]

local count = tonumber(ARGV[1])

参数

KEYS & ARGV

传递参数时的注意事项

# 传参数: list_a list_b 10
➜  7Debug git:(main) ✗ redis-cli --ldb --eval /Users/mw/Desktop/Github/Integration/Redis/7Debug/script1.lua list_a list_b 10
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 src = KEYS[1]

lua debugger> print
No local variables in the current context.

lua debugger> n
* Stopped at 2, stop reason = step over
-> 2   local dst = KEYS[2]

lua debugger> n
* Stopped at 3, stop reason = step over
-> 3   local count = tonumber(ARGV[1])
# 打印 KEYS 全部都是keys
lua debugger> print KEYS
<value> {"list_a""list_b""10"}
# 打印 ARGV
lua debugger> print ARGV
<value> {}
# 结束
lua debugger> n

(integer) 1

(Lua debugging session ended -- dataset changes rolled back)

127.0.0.1:6379> 
**参数 中 KEYS & ARGV 区分: 逗号隔开** 1. 参数`list_b,`, 逗号与key之间没有空格,则认为依旧是KEYS;
# 注意 
➜  7Debug git:(main) ✗ redis-cli --ldb --eval /Users/mw/Desktop/Github/Integration/Redis/7Debug/script1.lua list_a list_b , 10
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 src = KEYS[1]
# KEYS
lua debugger> print KEYS
<value> {"list_a""list_b"}
# ARGV
lua debugger> print ARGV
<value> {"10"}
lua debugger> 
lua debugger> n
* Stopped at 2, stop reason = step over
-> 2   local dst = KEYS[2]
lua debugger> n
* Stopped at 3, stop reason = step over
-> 3   local count = tonumber(ARGV[1])
lua debugger> n
* Stopped at 4, stop reason = step over
-> 4   return true
#
lua debugger> print
<value> src = "list_a"
<value> dst = "list_b"
<value> count = 10
lua debugger> n

(integer) 1

(Lua debugging session ended -- dataset changes rolled back)

127.0.0.1:6379> 

队列操作

将list_a中的一个元素push到list_b

➜  7Debug git:(main) ✗ redis-cli --ldb --eval /Users/mw/Desktop/Github/Integration/Redis/7Debug/script1.lua list_a list_b , 10
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 src = KEYS[1]
# 打印keys
lua debugger> print KEYS
<value> {"list_a""list_b"}
# 打印参数
lua debugger> print ARGV
<value> {"10"}
# 初始化队列 list_a、list_b
lua debugger> r lpush list_a 1 2 3 4 
<redis> lpush list_a 1 2 3 4
<reply> 4
lua debugger> r lpush list_b a b c d
<redis> lpush list_b a b c d
<reply> 4
lua debugger> n
* Stopped at 2, stop reason = step over
-> 2   local dst = KEYS[2]
lua debugger> n
* Stopped at 3, stop reason = step over
-> 3   local count = tonumber(ARGV[1])
lua debugger> n
* Stopped at 5, stop reason = step over
-> 5   local item = redis.call('rpop', src)
# next 执行pop
lua debugger> n
<redis> rpop list_a
<reply> "1"
* Stopped at 6, stop reason = step over
-> 6   redis.call('lpush', dst, item)
# next 执行push
lua debugger> n
<redis> lpush list_b 1
<reply> 5
* Stopped at 7, stop reason = step over
-> 7   return true
# r: redis; 获取list元素
lua debugger> r lrange list_a 0 -1
<redis> lrange list_a 0 -1
<reply> ["4","3","2"]
# r: redis; 获取list元素
lua debugger> r lrange list_b 0 -1
<redis> lrange list_b 0 -1
# 执行成功
<reply> ["1","d","c","b","a"]
# 重启,将所有执行回滚
lua debugger> restart

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 src = KEYS[1]
# 回滚至无数据
lua debugger> r lrange list_b 0 -1
<redis> lrange list_b 0 -1
<reply> []
lua debugger> 

断点调试

断点操作
# 写入redis 准备数据
➜  7Debug git:(main) ✗ redis-cli
127.0.0.1:6379> lpush list_a 1 2 3 4
(integer) 4
127.0.0.1:6379> lpush list_b a b c d
(integer) 4
127.0.0.1:6379> llen list_a
(integer) 4
127.0.0.1:6379> llen list_b
(integer) 4
127.0.0.1:6379> 
# 获取全部文件
lua debugger> w
   1   local src = KEYS[1]
   2   local dst = KEYS[2]
   3   local count = tonumber(ARGV[1])
   4   
-> 5   while count < 10 do
   6       local item = redis.call('rpop', src)
   7       if item == false then break end
   8       redis.call('lpush', dst, item)
   9       count = count -1
   10  end
   11  
   12  return redis.call('llen', dst);
# 显示第7行 【l:list】
lua debugger> l 7
   2   local dst = KEYS[2]
   3   local count = tonumber(ARGV[1])
   4   
-> 5   while count < 10 do
   6       local item = redis.call('rpop', src)
   7       if item == false then break end
   8       redis.call('lpush', dst, item)
   9       count = count -1
   10  end
   11  
   12  return redis.call('llen', dst);
# 显示第7行前后一行 【l:list】
lua debugger> l 7 1
   6       local item = redis.call('rpop', src)
   7       if item == false then break end
   8       redis.call('lpush', dst, item)
lua debugger> b 6
-> 5   while count < 10 do
  #6       local item = redis.call('rpop', src)
   7       if item == false then break end
# continue 继续,直到断点执行
lua debugger> c

(integer) 4

(Lua debugging session ended -- dataset changes rolled back)

127.0.0.1:6379> 

逐步断点

lua debugger> w
-> 1   local src = KEYS[1]
   2   local dst = KEYS[2]
   3   local count = tonumber(ARGV[1])
   4   
   5   while count > 0 do
   6       local item = redis.call('rpop', src)
   7       if item == false then break end
   8       redis.call('lpush', dst, item)
   9       count = count -1
   10  end
   11  
   12  return redis.call('llen', dst);
lua debugger> b 8
   7       if item == false then break end
  #8       redis.call('lpush', dst, item)
   9       count = count -1
# 验证断点位置
lua debugger> w
-> 1   local src = KEYS[1]
   2   local dst = KEYS[2]
   3   local count = tonumber(ARGV[1])
   4   
   5   while count > 0 do
   6       local item = redis.call('rpop', src)
   7       if item == false then break end
  #8       redis.call('lpush', dst, item)
   9       count = count -1
   10  end
   11  
   12  return redis.call('llen', dst);
# 等同与next
lua debugger> c
* Stopped at 8, stop reason = break point
->#8       redis.call('lpush', dst, item)

lua debugger> print
<value> src = "list_a"
<value> dst = "list_b"
<value> count = 10
<value> item = "1"
lua debugger> c
* Stopped at 8, stop reason = break point
->#8       redis.call('lpush', dst, item)
lua debugger> c
* Stopped at 8, stop reason = break point
->#8       redis.call('lpush', dst, item)
lua debugger> c
* Stopped at 8, stop reason = break point
->#8       redis.call('lpush', dst, item)
# 打印日志
lua debugger> print
<value> src = "list_a"
<value> dst = "list_b"
<value> count = 7
<value> item = "4"

redis.debug 一步到位

此处有加新代码:redis.debug('dubug value:', item)

lua debugger> w
-> 1   local src = KEYS[1]
   2   local dst = KEYS[2]
   3   local count = tonumber(ARGV[1])
   4   
   5   while count > 0 do
   6       local item = redis.call('rpop', src)
# 采用redis.debug
   7       redis.debug('dubug value:', item)
   8       if item == false then break end
   9       redis.call('lpush', dst, item)
   10      count = count -1
   11  end
   12  
   13  return redis.call('llen', dst);
# 继续,打印redis.debug处的日志
lua debugger> c
<debug> line 7: "dubug value:""1"
<debug> line 7: "dubug value:""2"
<debug> line 7: "dubug value:""3"
<debug> line 7: "dubug value:""4"
<debug> line 7: "dubug value:"false

(integer) 8

(Lua debugging session ended -- dataset changes rolled back)

127.0.0.1:6379> 

全部评论: 0

    我有话说:

    Redis系列Lua

      本文目标 学习lua基本语法 能够采用redis+lua lua 基本语法 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用

    Redis系列八 抢红包

      本文概述 掌握红包的两种常见生成算法 掌握lua+redis 实现原子性抢红包 项目中还有mysql相关内容 了解jmeter的基本用法 遗留问题 redis同步DB时机问题

    Redis系列四 锁

      本文目标 1. 熟悉乐观锁ABA概念 2. 理解掌握redis事务以及watch回滚; 3. 实战redis锁 乐观锁 乐观锁是一种不会阻塞其他线程并发的机制,它不会使用数据库的

    Redis系列一 基本用法&应用场景

        说明 redis的最基本使用方法以及使用场景。 字符串 // stringasync function stringFun() { const [key

    Redis系列二:位图实战,实现打卡签到

    前言 如果要统计一篇文章的阅读量,可以直接使用 Redis 的 incr 指令来完成。 如果要求阅读量必须按用户去重,那就可以使用 set 来记录阅读了这篇文章的所有用户 id,获取

    Redis系列九 推荐系统-布隆过滤器

      布隆过滤器 概念 布隆过滤器是一种空间利用率较高的概率型数据结构,用来测试一个元素是否在集合中。但是存在一定可能,导致结果误判。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在. 特性: 与哈希表不同,...

    Redis系列四 GEO附近的人

    GEO算法 GeoHash是一种地址编码方法。将二维的空间经纬度数据编码成一个字符串; 地球上的经度范围:[-180, 180],纬度范围:[-90,90]。如果以本初子午线、赤道为界,地球可以分成4个部分。 我们先将平面切割成四个正方形,然...

    为什么单线程的Redis能够达到百万级的QPS?

    作者:在江湖中coding链接:https://juejin.im/post/5e6097846fb9a07c9f3fe744 性能测试报告 查看了下阿里云 Redis 的性能测试报告如下,能够

    Redisson 3.13.6 发布,官方推荐的 Redis 客户端

    Redisson 3.13.6 已发布,这是一个 Java 编写的 Redis 客户端,具备驻内存数据网格(In-Memory Data Grid)功能,并获得了 Redis 的官方推荐

    商城系统 DBShop V3.0 Beta 发布

    全新重构,首次亮相。 系统简介 DBShop企业级商城系统,使用PHP语言基于Laminas(Zendframework 3) + Doctrine 2 组合框架开发完成。可定制、多终端、多场景、多

    BAT大牛Redis客户端与服务端交互原理

    Redis实例运行在单独的进程中,应用系统Redis客户端)通过Redis协议和Redis Server

    Redis 5.0.11、6.0.11、6.2 发布,修复 32 位系统上的整数溢出

    Redis 同时发布了 5.0.11、6.0.11 和 6.2 版本。对于使用 32 位 Redis 的用户来说,此次更新解决了一个重要的安全问题,即 32 位系统上的整数溢出((CVE-2021

    Martian框架发布 3.0.3 版本,Redis分布式锁

    项目简介 Martian 是一个声明式 API 编程(DAP)框架,可以帮助你快速开发后端服务。 以HttpServer作为 http服务,彻底脱离Tomcat这一类的Web容器和Servlet,同时也让项目减少了几个依赖 声明式API,让Co...

    Redis多线程演进

    Redis作为一个基于内存的缓存系统,一直以高性能著称,因没有上下文切换以及无锁操作,即使在单线程处理情况下,读速度仍可达到11万次/s,写速度达到8.1万次/s。但是,单线程的设计也给Redis

    精品推荐:Redis主从复制

    持久化保证了即使 redis 服务重启也会丢失数据,因为 redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 redis 服务器的硬盘损坏了可能会导致数据丢失,如果通过 redis

    Redis 6.2.2 发布

    Redis 6.2.2 现已发布,该版本升级迫切性程度为高。对于那些使用 ACL 和 pub/sub,CONFIG REWRITE,或遭受性能下降影响的用户来说,详见下文: 修复了

    Redis 6.2.1 发布

    Redis 6.2.1 现已发布,该版本升级迫切性程度为低:修复了编译问题。具体更新内容如下: Bug 修复 修复带有已删除记录的 stream 的 sanitize-dump