복붙노트

[REDIS] 그것은 레디 스의 다른 루아 스크립트에서 정의 루아 함수를 호출 할 수 있습니다?

REDIS

그것은 레디 스의 다른 루아 스크립트에서 정의 루아 함수를 호출 할 수 있습니다?

나는 지방의 키워드없이 함수를 선언 한 후 꽃밥 스크립트에서 해당 함수를 호출하는 시도했지만 내가 명령을 실행할 때 그것은 나에게 오류를 제공합니다.

test = function ()    
    return 'test'
end



# from some other script
test()

편집하다:

나는 여전히 아무 대답이 없다 믿을 수 없다. 내 설정의 자세한 내용을 포함 할 수 있습니다.

나는 레디 스에 스크립트를로드 할 레디 스-scripto 패키지 노드를 사용하고 있습니다. 다음은 예이다.

var Scripto = require('redis-scripto');
var scriptManager = new Scripto(redis);

scriptManager.loadFromDir('./lua_scripts');

var keys    = [key1, key2];
var values  = [val];

scriptManager.run('run_function', keys, values, function(err, result) {
console.log(err, result)
})

그리고 루아 스크립트.

-- ./lua_scripts/dict_2_bulk.lua

-- turns a dictionary table into a bulk reply table
dict2bulk = function (dict)
    local result = {}
    for k, v in pairs(dict) do
        table.insert(result, k)
        table.insert(result, v)
    end
    return result
end


-- run_function.lua 

return dict2bulk({ test=1 })

다음과 같은 오류가 발생합니다.

[Error: ERR Error running script (call to f_d06f7fd783cc537d535ec59228a18f70fccde663): @enable_strict_lua:14: user_script:1: Script attempted to access unexisting global variable 'dict2bulk' ] undefined

해결법

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

    1.중요 사항 : 아래 참조 요시야의 대답. 내 대답이 틀리거나 불완전한 적어도 것으로 밝혀졌습니다. 어느 날 매우 행복 당연히하게, 그것은 레디 스 더욱 유연합니다.

    중요 사항 : 아래 참조 요시야의 대답. 내 대답이 틀리거나 불완전한 적어도 것으로 밝혀졌습니다. 어느 날 매우 행복 당연히하게, 그것은 레디 스 더욱 유연합니다.

    내 잘못된 / 불완전한 답 :

    나는 이것이 가능하지 꽤 확신 해요. 당신은 (워드 프로세서 읽기) 전역 변수를 사용할 수 없으며, 스크립트 자체는 레디 스 루아 엔진에 의해 로컬 및 임시 범위를 가져옵니다.

    그들이 어떤 쓰기 작업을 할 경우 루아 기능이 자동으로 장면 뒤에 '쓰기'플래그를 설정합니다. 이것은 트랜잭션을 시작합니다. 당신이 루아 전화를 계단식 경우, 레디 스의 부기는 폭포가 레디 스 슬레이브에 실행 특히, 매우 성가신 될 것입니다. 평가 및 EVALSHA 의도적으로 유효한 레디 스로 제공되지 않는 이유의는 루아 스크립트 내부에서 호출합니다. 동일은 당신이하려고하는 이미 '로드'루아 함수를 호출 간다. 슬레이브가 첫 번째 스크립트의 부하와 두 번째 스크립트의 임원을 다시 부팅하면 어떻게 될까?

    우리는 이러한 한계를 극복하기 위해 무엇을 :

    EVAL을 사용하지 마십시오 만 SCRIPT로드 및 EVALSHA를 사용합니다. 레디 스 해시 세트 내부의 SHA1을 저장합니다.

    헌신적 인 루아 스크립트가 자동으로 논리적 이름, 해시 세트에서 레디 스 마스터에 저장 그것의 SHA1 체크섬을 얻을 수 있도록 우리는 우리의 버전 관리 시스템이 자동화. 클라이언트는 (노예에, 설정에서 우리 장애인 EVAL +의 LOAD) EVAL을 사용할 수 없습니다. 그러나 클라이언트는 다음 단계에 대한 SHA1을 요청할 수 있습니다. 거의 모든 루아 기능은 다음 호출에 대한 SHA1을 반환합니다.

    이, TW 도움이되기를 바랍니다

  2. ==============================

    2.허용 대답이 잘못 때문에, 허용 대답에 위배 될거야.

    허용 대답이 잘못 때문에, 허용 대답에 위배 될거야.

    명시 적으로 이름이 지정된 함수를 정의 할 수는 없지만, 당신은 당신이 EVALSHA으로 호출 할 수있는 스크립트를 호출 할 수 있습니다. 보다 구체적으로, 루아 스크립트의 모든 명시 적 SCRIPT의 LOAD를 통해 정의했는지 또는 암시 EVAL을 통해이에서 글로벌 루아 네임 스페이스에서 사용할 수있는 F_ (때까지 / 당신은 SCRIPT 플러시 필요하지 않은 경우) 당신은 어떤 시간을 호출 할 수 있습니다.

    당신이로 실행하는 것이 문제는 함수는 인수를 고려하지 않기 때문에 정의되어 있는지, 그리고 키와 ARGV 테이블은 실제로 전역 있습니다. 그래서 당신은 루아 스크립트간에 통신 할 수 있도록하려면, 당신은 당신의 키와 ARGV 테이블을 난도질하는 중 필요, 또는 당신은 당신의 기능 사이의 통신을위한 표준 레디 스의 키 스페이스를 사용해야합니다.

    127.0.0.1:6379> script load "return {KEYS[1], ARGV[1]}"
    "d006f1a90249474274c76f5be725b8f5804a346b"
    127.0.0.1:6379> eval "return f_d006f1a90249474274c76f5be725b8f5804a346b()" 1 "hello" "world"
    1) "hello"
    2) "world"
    127.0.0.1:6379> eval "KEYS[1] = 'blah!'; return f_d006f1a90249474274c76f5be725b8f5804a346b()" 1 "hello" "world"
    1) "blah!"
    2) "world"
    127.0.0.1:6379>
    

    이 모든 것은이 규격의 완전한 위반, 당신은 레디 스 클러스터 시나리오에서이 작업을 실행하려고하면 이상한 방식으로 작동을 중지 전적으로 가능하다 말했다.

  3. ==============================

    3.나 혼자 충분히 남기지 않도록 하나니까, 나는 간단한 내부 호출 의미를 허용하는 패키지를 만들었습니다. (파이썬) 패키지는 GitHub의에서 사용할 수 있습니다.

    나 혼자 충분히 남기지 않도록 하나니까, 나는 간단한 내부 호출 의미를 허용하는 패키지를 만들었습니다. (파이썬) 패키지는 GitHub의에서 사용할 수 있습니다.

    해시 매핑 내부적으로>, 및 CALL 변환 <이름> (<키>, )로 - 긴 짧은 이야기, 그것은, 호출 스택으로 ARGV를 사용 _keys 및 _ARGV 열쇠 / ARGV 참조를 변환, 이름으로 레디 스를 사용합니다. 테이블 룩업 레디 스 APPEND + + 루아 함수 호출.

    METHOD.txt 파일은 어떤 일이 일어나는지 설명하고, 내가 루아 스크립트를 번역하는 데 사용되는 정규 표현식의 모든 lua_call.py에서 사용할 수 있습니다. 내 의미를 다시 사용하시기 바랍니다.

    기능 레지스트리의 사용은 레디 스 클러스터 또는 다른 멀티 샤드 설정에서 작업이 매우 어려울 수 있지만, 단일 마스터 애플리케이션을 위해, 그것은 예측 가능한 미래를 위해 작동합니다.

  4. from https://stackoverflow.com/questions/21718277/is-it-possible-to-call-lua-functions-defined-in-other-lua-scripts-in-redis by cc-by-sa and MIT license