@用户_script:1:针对持有错误类型值的键的错误类型操作

gstyhher  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(296)

下面是我的lua脚本

if redis.call('sismember',KEYS[1],ARGV[1])==1
then redis.call('srem',KEYS[1],ARGV[1])
else return 0
end
store = tonumber(redis.call('hget',KEYS[2],'capacity'))
store = store + 1
redis.call('hset',KEYS[2],'capacity',store)
return 1

当我在java中运行这个srcipt时

@user_script:1: WRONGTYPE Operation against a key holding the wrong kind of value

抛出,java代码就像

Object ojb = jedis.evalsha(sha,2,userName.getBytes(),
                id.getBytes(),id.getBytes()) ;

在我的代码中,用户名是“tau”,id是“002”,我测试“tau”和“002”的类型,如下所示,

127.0.0.1:6379> type tau
set
127.0.0.1:6379> type 002
hash

确切地说,它们的内容是:

127.0.0.1:6379> hgetall 002
name
"鏁版嵁搴撲粠鍒犲簱鍒拌窇璺?
teacher
"taochq"
capacity
54
127.0.0.1:6379> smembers tau
002
004
001
127.0.0.1:6379>

现在我很困惑,不知道怎么了,任何帮助都会很感激的

1yjd4xko

1yjd4xko1#

这个错误非常冗长-您试图对错误类型的键执行操作。
MONITOR 然后你的脚本-然后你就可以很容易地发现错误。

jmo0nnb3

jmo0nnb32#

请将脚本作为:

EVAL "if redis.call('sismember',KEYS[1],ARGV[1])==1 \n then redis.call('srem',KEYS[1],ARGV[1]) \n else return 0 \n end \n local store = tonumber(redis.call('hget',KEYS[2],'capacity')) \n store = store + 1 \n redis.call('hset',KEYS[2],'capacity',store) \n return 1" 2 tau 002 002

你看看它是否管用。很可能, userName.getBytes() 以及 id.getBytes() 你所期望的不会回来。使用 MONITOR 正如itamar所建议的,查看服务器实际收到了什么。
你会得到一个不同的问题: Script attempted to create global variable 'store' . 添加 local 到第五行:

local store = tonumber(redis.call('hget',KEYS[2],'capacity'))

相关问题