【问题标题】:How to output to console from Redis Lua script?如何从 Redis Lua 脚本输出到控制台?
【发布时间】:2014-12-02 06:48:02
【问题描述】:

为什么不打印'hello'?

$ redis-cli
127.0.0.1:6379> eval "print( 'hello' )" 0
(nil)
127.0.0.1:6379>

在 Mac OS X 上运行 2.8.14,在 Windows 7 上运行 2.8.12。

我从 Jedis 调用 Lua 脚本。开发这些就像造船一个瓶子,戴着手套,而有人在打我的脸。我的最终目标是通过打印跟踪语句、调试等以某种方式重新创建一个半功能开发堆栈。

对于我的 Lua 脚本,我的解决方法是使用名为“log”的 Redis 列表,将其返回给 Jedis,然后转储内容。有点像这样:

redis.call( 'del', 'log' )
redis.call( 'rpush', 'log', 'trace statement 1' )
redis.call( 'rpush', 'log', 'trace statement 2' )

...

redis.call( 'lrange', 'log', 0, -1 )

提前感谢您提供的任何提示、帮助等。

更新:刚刚注意到 'hello' 确实通过终端窗口输出 redis-server 可执行文件。聪明的。所以现在我为 redis-server、redis-cli interactive 和 redis-cli monitor 分别设置了一个终端。

更新 2:刚刚发现我可以像这样将跟踪语句打印到 redis-cli 监视器:

eval "redis.call( 'echo', 'ugh')" 0

看起来有点像这样:

123.456 [0 127.0.0.1:57709] "eval" "redis.call( 'echo', 'ugh')" "0"
123.456 [0 lua] "echo" "ugh"

【问题讨论】:

    标签: redis lua


    【解决方案1】:

    我终于发现有redis.log(loglevel, message),它也写入redis-server的控制台输出。

    【讨论】:

    • 我最近发布了这个方法集合,所有这些方法都旨在帮助在 Redis 中跟踪和调试 Lua - 希望它有所帮助:) redislabs.com/blog/…
    【解决方案2】:

    有更好的方法来开发针对 redis 的 LUA 脚本。

    使用 lua 日志是一种方法。但您也可以通过订阅在调试主题上发布“按需”日志。

    您还可以设置带有 lua 断点的 IDE,我认为这是开发的最佳解决方案:http://www.trikoder.net/blog/make-lua-debugging-easier-in-redis-87/

    此外,不要忘记自动测试、单元和/或集成测试很有帮助(针对调试 redis 实例执行)。

    【讨论】:

      【解决方案3】:

      使用绝地,这是你可以做到的.. 这是使用 set 和 get 命令的示例.. 您需要在类路径中包含 jedis-2.6.0 jar 文件。

      //jar file - jedis-2.6.0.jar
      
      import redis.clients.jedis.Jedis;
      public class MainClass {
      
      public static void main(String[] args){
           Jedis jedis = new Jedis("localhost");
           System.out.println("Connection to server sucessfully");
           jedis.set("name", "a");
           System.out.println("Stored string (b4 lua) : "+ jedis.get("name"));
           String script="redis.call('set','name','b')";
           jedis.eval(script);
           System.out.println("Stored string : "+ jedis.get("name"));
      }
      
      }
      

      输出: 连接服务器成功 存储的字符串(b4 lua):a 存储字符串:b

      【讨论】:

        【解决方案4】:

        在托管 Redis 实例的情况下。 有时,您无权访问 Redis 的日志文件

        所以redis.log(loglevel, message) 无济于事。

        我最终得到了一个有点天真的解决方案,但确实做到了,而且比 OP 在他的问题中所做的更简洁:

        您可以使用 Redis 自身的键来在脚本本身中存储整个脚本执行的日志行(项目):

        你可以在 LUA 脚本的顶部写这个:

        local loglist = "log:my_script"
        redis.pcall("DEL", loglist) -- Clear the lines list of the previous execution
        redis.pcall("EXPIRE", loglist, 300) -- auto-vanish to preserve a space in case forget to delete it 
        
        local function logme(msg)
            redis.pcall("RPUSH", loglist, msg)
        end
        

        --这里是一个例子,以后如何在同一个脚本中使用它

        logme(string.format("reached phase # %d", cur_phase))
        

        在执行完成后检查日志。您可以从 CLI 或任何其他语言客户端列出关键行(元素)。

        LRANGE "log:my_script" 0 -1
        
        • 不要忘记在生产环境中评论它(或至少 logme 函数内的行)。

        【讨论】:

          猜你喜欢
          • 2011-01-29
          • 2020-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多