Небольшие проблемы в использовании Redis и Lua

Redis Lua

Небольшие проблемы при использовании Redis и Lua - оригинальная ссылка

проблема

Выполнить в RedisgetилиhgetнесуществующийkeyилиfieldКогда возвращаемое значение является явным в терминале(nil), аналогично следующему

127.0.0.1:6379> get test_version
(nil)

Если вы решите, является ли полученное значение нулевым значением в скрипте Lua, это вызовет более запутанную проблему.Если вы думаете, что нулевое значение оценивается, используйтеnilВот именно, но на самом деле это не так, а следующим образом:

127.0.0.1:6379> get test_version
(nil)
127.0.0.1:6379> EVAL "local a = redis.call('get',KEYS[1]) print(a) if a == 'nil' then return 1 else return 0 end" 1 test_version test_version
(integer) 0

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

127.0.0.1:6379> get test_version
(nil)
127.0.0.1:6379> EVAL "local a = redis.call('get',KEYS[1]) return type(a)" 1 test_version test_version
"boolean"

Как видно из приведенного выше сценария, когда результат, возвращаемый Redis,(nil)Когда его реальный тип данныхboolean, так что мы напрямую судимnilпроблематично.

Официальная документация Redis

листаяофициальная документацияНайдите проход, показанный ниже,

Redis to Lua conversion table.

  • Redis integer reply -> Lua number
  • Redis bulk reply -> Lua string
  • Redis multi bulk reply -> Lua table (may have other Redis data types nested)
  • Redis status reply -> Lua table with a single ok field containing the status
  • Redis error reply -> Lua table with a single err field containing the error
  • Redis Nil bulk reply and Nil multi bulk reply -> Lua false boolean type

Lua to Redis conversion table.

  • Lua number -> Redis integer reply (the number is converted into an integer)
  • Lua string -> Redis bulk reply
  • Lua table (array) -> Redis multi bulk reply (truncated to the first nil inside the Lua array if any)
  • Lua table with a single ok field -> Redis status reply
  • Lua table with a single err field -> Redis error reply
  • Lua boolean false -> Redis Nil bulk reply.

решение

пройти черезофициальная документация, мы знаем, что следует судить непосредственно, когда сценарий Lua возвращает нулевое значение.true/false, измените сценарий оценки следующим образом

127.0.0.1:6379> get test_version
(nil)
127.0.0.1:6379>  EVAL "local a = redis.call('get',KEYS[1]) if a == false then return 'empty' else return 'not empty' end" 1 test_version test_version
"empty"

Подписывайтесь на нас

关注我们