복붙노트

[REDIS] 한 레디 스 루아 스크립트를 사용하여 여러 개의 DB를 사용?

REDIS

한 레디 스 루아 스크립트를 사용하여 여러 개의 DB를 사용?

그것은 하나의 레디 스 루아 스크립트는 두 개 이상의 데이터베이스에 접속이 가능합니까? 내가 한 모든 것을 할 싶어요 DB 0에서 메타 정보와 함께 나는 현재 DB 0 내 정상 워크 플로우 1. DB에 다른 유형의 정보 API 호출을 기반으로 DB 1 업데이트를하고있는 한 종류의 정보를 가지고 루아 스크립트는하지만, 여러 DBS를 공격하는 방법을 알아낼 수 없습니다. 나는 레디 스-평을 사용하여 파이썬에서이 일을 해요 :

lua_script(keys=some_keys,
           args=some_args,
           client=some_client)

클라이언트가 특정의 DB를 의미하기 때문에, 나는 갇혔어요. 아이디어?

해결법

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

    1.일반적으로 다른 레디 스 데이터베이스에 관련 데이터를 입력하는 잘못된 생각이다. 키 명명 규칙으로 네임 스페이스를 정의에 비해 거의 혜택 (등 보안, 지속성, 유통 관리에 관한 별도의 단위는 ...)이있다. 그리고 주요 단점은 클라이언트가 수동으로 동시에 여러 데이터베이스를 대상으로 고객을위한 쉬운 오류가 올바른 데이터베이스의 선택을 처리해야합니다.

    일반적으로 다른 레디 스 데이터베이스에 관련 데이터를 입력하는 잘못된 생각이다. 키 명명 규칙으로 네임 스페이스를 정의에 비해 거의 혜택 (등 보안, 지속성, 유통 관리에 관한 별도의 단위는 ...)이있다. 그리고 주요 단점은 클라이언트가 수동으로 동시에 여러 데이터베이스를 대상으로 고객을위한 쉬운 오류가 올바른 데이터베이스의 선택을 처리해야합니다.

    당신은 여전히 ​​여러 데이터베이스를 사용하려는 경우 지금, 레디 스-PY와 루아 스크립트와 그것을 작동하게하는 방법이있다.

    레디 스-평 때문에 기본 스레드 안전 연결 풀 구현의, (일반적으로 현재 데이터베이스를 전환하는 데 사용) SELECT 명령의 래퍼를 정의하지 않습니다. 그러나 아무것도 방지 당신은 루아 스크립트에서 SELECT를 호출합니다.

    다음 예를 살펴 보겠습니다 :

    $ redis-cli
    SELECT 0
    SET mykey db0
    SELECT 1
    SET mykey db1
    

    다음 스크립트를 표시 동일한 클라이언트 연결에서이 데이터베이스에서의 mykey의 값.

    import redis
    
    pool = redis.ConnectionPool(host='localhost', port=6379, db=0)
    r = redis.Redis(connection_pool=pool)
    
    lua1 = """
       redis.call("select", ARGV[1])
       return redis.call("get",KEYS[1])
    """
    script1 = r.register_script(lua1)
    
    lua2 = """
       redis.call("select", ARGV[1])
       local ret = redis.call("get",KEYS[1])
       redis.call("select", ARGV[2])
       return ret
    """
    script2 = r.register_script(lua2)
    
    print r.get("mykey")
    print script2( keys=["mykey"], args = [1,0] )
    print r.get("mykey"), "ok"
    print
    print r.get("mykey")
    print script1( keys=["mykey"], args = [1] )
    print r.get("mykey"), "misleading !!!"
    

    스크립트 lua1 순진입니다 : 그냥 값을 반환하기 전에 해당 데이터베이스를 선택합니다. 그 실행 후, 접속에 관련된 현재 데이터베이스가 변경 되었기 때문에 그것의 사용은, 오해의 소지가있다. 이 작업을 수행하지 마십시오.

    스크립트 lua2 훨씬 낫다. 그것은 대상 데이터베이스 매개 변수로 현재 데이터베이스를합니다. 그것은 다음 명령은 아직 정확한 데이터베이스에서 실행되는 연결에 적용 그래서, 현재 데이터베이스 스크립트가 끝나기 전에 다시 활성화되어 있는지 확인합니다. 클라이언트가 체계적으로 제공해야 불행하게도, 루아 스크립트에서 현재 데이터베이스를 추측 할 명령은 없습니다. 이 복잡한 스크립트가 복잡하고 어색하게하도록 루아 스크립트, (심지어 이전 오류의 경우) 일이 어떤 말 현재 데이터베이스를 다시 설정해야합니다 유의하시기 바랍니다.

  2. from https://stackoverflow.com/questions/16802090/use-multiple-dbs-with-one-redis-lua-script by cc-by-sa and MIT license