복붙노트

[REDIS] 레디 스 - 반환 값으로 루아 테이블 - 왜이 작동하지 않습니다

REDIS

레디 스 - 반환 값으로 루아 테이블 - 왜이 작동하지 않습니다

나는 레디 스를 통해이 코드를 실행하면 평가는 결과가 반환되지 않습니다. 어떤 생각이 왜 작동하지?

redis-cli EVAL "$(cat bug.lua)" 0
local retv = {}
retv["test"] = 1000

return retv

나는 테이블을 초기화하면 혼자 값은 인쇄 가져옵니다.

$ cat bug.lua 
--!/usr/bin/env lua


local retv = {"This", "is", "a", "bug" }
retv["test"] = 1000

return retv

$ redis-cli EVAL "$(cat bug.lua)" 2 a b
1) "This"
2) "is"
3) "a"
4) "bug"

해결법

  1. ==============================

    1.당신은 레디 스 EVAL 문서를 참조하는 경우 당신은 레디 스 응답에 루아 테이블을 변환하는 규칙 레디 스 용도가 무엇인지 볼 수 있습니다 :

    당신은 레디 스 EVAL 문서를 참조하는 경우 당신은 레디 스 응답에 루아 테이블을 변환하는 규칙 레디 스 용도가 무엇인지 볼 수 있습니다 :

    그래서 특별한 경우 2, 3를 제외하고, 레디 스는 여기 (nil의 요소를 발견 해당하는 소스 코드까지 테이블, ... 그것은 retv [1], retv [2]를 읽고 의미 시퀀스 (즉, 목록)로 가정 부분).

    retv [ "시험"] 귀하의 경우에는 무시됩니다 이유를 설명.

    당신은 당신의 코드를 변경하는 경우 :

    local retv = {"This", "is", "a", "bug" }
    retv[5] = 1000
    return retv
    

    그런 다음이 추가 요소가 반환됩니다 :

    1) "This"
    2) "is"
    3) "a"
    4) "bug"
    5) (integer) 1000
    
  2. ==============================

    2.@deltheil에서 답변 유효합니다.

    @deltheil에서 답변 유효합니다.

    당신이 테이블을 포장하고 소비자에게 전달하는 cjson 라이브러리를 사용할 수 있지만 기억하십시오.

    귀하의 루아 파일 :

    local retv = {"This", "is", "a", "bug" }
    retv["test"] = 1000
    
    return cjson.encode(retv)
    

    명령:

    redis-cli EVAL "$(cat bug.lua)" 0
    

    결과:

    "{\"1\":\"This\",\"2\":\"is\",\"3\":\"a\",\"4\":\"bug\",\"test\":1000}"
    
  3. from https://stackoverflow.com/questions/24298763/redis-lua-tables-as-return-values-why-is-this-not-working by cc-by-sa and MIT license