jedis llen 结果与 redis llen 不相等。

我遇到了一个非常奇怪的关于Redis及其Java客户端Jedis的问题。我在Redis中有两个列表名为workMQbackupMQ,当我在redis-cli中执行llen workMQ时,它返回16。然而当我在Java代码中使用Jedis执行jedis.llen("workMQ")时,它返回0。但是当通过在Java代码中运行jedis.lpush("workMQ", "data")来传输新数据时,Redis的llen workMQ变为1。为什么jedis.llen("workMQ")不能识别此列表中剩余的16个数据项?

在这个奇怪的问题出现之前,我使用Lua脚本执行了rpoplpush操作,如下所示。

eval "for i = 1, 10 do\r redis.call('rpoplpush', 'backupMQ', 'workMQ')\r end" 0

实际上这个Lua脚本有一些错误,正确的脚本是

eval "for i = 1, 10 do\r redis.call('rpoplpush', KEYS[1], KEYS[2])\r end" 2 backupMQ workMQ

也许Redis和Lua之间存在一些类型错误。我已经执行了这两个Lua脚本,但仍然无法解决问题。

PS:我的Jedis客户端版本是2.7.2,来自Jedis Github的最新稳定版本。

感谢您的时间。

已解决:经过一夜,Redis服务器神奇地识别了workMQ的项长度,一切都很好。真的很奇怪。

点赞
用户5361482
用户5361482
  1. 这种奇怪的事情不可能发生。你一定做错了什么。例如,redis-cli能够接受类似于“llen(workMQ)”的命令吗?或者你实际上是指“llen workMQ”?

我认为你很可能是在使用jedis操作不同于redis-cli的列表键!

  1. Lua的问题很简单,你应该在lua脚本结束时返回一个值(按你的意愿)。如果还是无法解决,把详细的错误信息发给我!
2015-09-23 13:49:51