2014-01-29 3 views
7

Я пытающегося использовать команду Redis TYPE внутри сценария Lua (выполняется с помощью EVAL)Использование команды TYPE внутри Redis/Lua Script

local key_type = redis.call("TYPE", key) 

Согласно документации Redis, это должно возвращать строку "none", "zset" и т. Д.

Однако тип возвращаемого значения - это lua table. Сравнение значения с строкой всегда возвращает false.

мне удалось обойти эту проблему путем изменения вызова

local key_type = redis.call("TYPE", key)["ok"] 

Это значение действительно является строкой, и делает работу в командах сравнения строк. Я беспокоюсь, что это ошибка в моей конкретной версии Redis, и она будет ломаться в будущих версиях при обновлении.

Кто-нибудь знает, если это ожидаемое поведение или ошибка?

ответ

9

Команда TYPE возвращает статус ответа (a.k.a простой строки), например "+list\r\n".

На стороне редактирования Redis, call реализован luaRedisCallCommand, который выполняет реальную команду Redis за кулисами.

После успешного выполнения эта функция преобразует результат команды в redisProtocolToLuaType.

Когда ответ статуса встречается, эта функция создает таблицу Lua с "ok" как ключ, и ответ статуса в качестве значения (см redisProtocolToLuaType_Status). Итак:

  • нет ошибки,
  • поэтому redis.call("TYPE", key) представляет собой таблица (и, таким образом, вам нужно получить значение ключа "ok", как вы делали, чтобы получить key «s типа в виде строки) ,

Примечание: когда вы непосредственно возвращают таблицу, Redis берет на себя, чтобы получить значение, связанное с ключом "ok", и возвращает его в качестве ответа статус, например:

> EVAL 'return redis.call("TYPE", "foo")' 
set 

Смотрите это code section больше Детали.

+0

Спасибо за подробный и надежный ответ. –

Смежные вопросы