为什么这不打印'你好'?
$ 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 executable。聪明。所以现在我为redis-server,redis-cli interactive和redis-cli监视器分别设置终端。
更新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"
答案 0 :(得分:11)
面掌掌。终于想通了redis.log(loglevel,message)。这也写入了redis-server的控制台输出。
特别感谢有帮助的匿名选民。你是一个优秀的人。
答案 1 :(得分:2)
有更好的方法可以针对redis开发LUA脚本。
使用lua日志是一种方法。但您也可以通过订阅来发布调试主题以获得“按需”日志。
您还可以使用lua断点设置IDE,我认为这是开发的最佳解决方案:http://www.trikoder.net/blog/make-lua-debugging-easier-in-redis-87/
另外,不要忘记自动测试,单元和/或集成测试很有用(针对调试redis实例执行)。
答案 2 :(得分:1)
使用jedis,这是你怎么做的.. 这是使用set和get命令的示例.. 你需要在classpath中包含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
答案 3 :(得分:0)
如果是托管的 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