#redis #lua
#redis #lua
Вопрос:
я хочу подсчитать тип данных каждого ключа redis, я пишу следующий код, но запускаю ошибку, как это исправить?
local detail = {}
detail.hash = 0
detail.set = 0
detail.string = 0
local match = redis.call('KEYS','*')
for i,v in ipairs(match) do
local val = redis.call('TYPE',v)
detail.val = detail.val 1
end
return detail
(ошибка) Ошибка при запуске скрипта (вызов f_29ae9e57b4b82e2ae1d5020e418f04fcc98ebef4): @user_script:10: user_script:10: попытка выполнить арифметические вычисления над полем ‘val’ (нулевое значение)
Ответ №1:
Ошибка сообщает вам, что detail.val равен нулю. Это означает, что для ключа «val» нет табличного значения. Следовательно, вам не разрешается выполнять с ним какие-либо арифметические операции.
Проблема а)
detail.val
является синтаксическим сахаром для detail["val"]
. Итак, если вы ожидаете, что val
это будет строка, то правильным способом использовать ее в качестве ключа таблицы будет detail[val]
.
Возможная проблема b)
Проведя быстрое исследование, я обнаружил, что этот вызов redis может возвращать таблицу, а не строку. Поэтому, если detail[val]
не работает, проверьте val
тип.
Комментарии:
1. я выясняю, почему значение равно нулю, значение val — это таблица, реальное значение равно val.ok = хэш, набор или другой тип данных ,
2. @user1208081, поэтому вы хотели бы:
data[val] = (data[val] or 0) 1