@user_script: 1: WRONGTYPE Операция с ключом, содержащим неправильный тип значения - PullRequest
0 голосов
/ 13 февраля 2020

Ниже приведен мой 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

, когда я запускаю этот srcipt в Java, исключение типа

@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()) ;

, где userName - это "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>

Теперь я так растерялся и не знаю, что случилось, любая помощь будет благодарна

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Попробуйте свой скрипт как:

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, поскольку Итамар предлагает посмотреть, что на самом деле достигает сервера.

Вы получите отдельную другую проблему: Script attempted to create global variable 'store'. Добавьте local к 5-й строке:

local store = tonumber(redis.call('hget',KEYS[2],'capacity'))
0 голосов
/ 13 февраля 2020

Ошибка довольно многословна - вы пытаетесь выполнить операцию с ключом неправильного типа.

Запустите MONITOR рядом, а затем ваш сценарий - тогда вы будете быть в состоянии легко определить ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...