복붙노트

[REDIS] 레디 스의 루아 때 정말 그것을 사용하는 방법?

REDIS

레디 스의 루아 때 정말 그것을 사용하는 방법?

나는 연구와 루아와 비트를 연주하기 시작했습니다 및 키 잡아 범위에 원하는 때 큰 것으로 나타났습니다. 전의:

business:5:visits:2013-11-12
business:5:visits:2013-11-13
etc

루아와 나는 단지 레디 스 대신 날짜의 전체 범위에 하나 개의 명령을 보낼 수 있습니다.

지금은 더 우리의 논리 변환 레디 스에 이동에 대해 생각하고 있어요.

현재 다음과 같습니다 우리의 메시지 저장 프로세스를 가지고 :

// create a new unique id
redisClient.incr(Config.messageId, function(err, reply) {
    var messageId = reply.toString();
    var timestmp = Date.now();

    // push message
    redisClient.zadd(Config.history + ':' + obj.uid + ':' + obj.channel.replace(/\s+/g, ''), timestmp, messageId);

    // store the message data by messageId
    redisClient.hmset(Config.messageHash + ':' + messageId, {
        'user_id': obj.uid,
        'text_body': "some text",
        'text_date': timestmp,
    });


    // set expires
    redisClient.expire(Config.history + ':' + obj.uid + ':' + obj.channel.replace(/\s+/g, ''), Config.messageExpire);
    redisClient.expire(Config.messageHash + ':' + messageId, Config.messageExpire);


    // add to mysql-sync queue
    redisClient.RPUSH(Config.messageMySQLSyncQueue, Config.messageHash + ':' + messageId);

});

위는 쉽게 루아로 변환 할 수 있지만 성능에 대한 가치가?

대신 루아이 쓰기 만 레디 스 1 개 명령을 실행해야 할 빠를까요? 그것은 다른 명령을 차단하는 문제가 발생할 것인가?

해결법

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

    1.루아 스크립트는 MULTI 명령 등의 작업에 의미가있다. 당신은 레디 스 클라이언트에서 MULTI 명령을 사용하여 개발하는 것이 실제로 대부분의 명령은 루아에서 구현 될 수있다. 즉, 당신은 스크립트에서 일부 복잡한 작업을 캡슐화 할 수 및 데이터 계층은 데이터가 레디 스에 전략을 모델링에 대한 걱정없이 원자 쓰기 작업을 수행합니다.

    루아 스크립트는 MULTI 명령 등의 작업에 의미가있다. 당신은 레디 스 클라이언트에서 MULTI 명령을 사용하여 개발하는 것이 실제로 대부분의 명령은 루아에서 구현 될 수있다. 즉, 당신은 스크립트에서 일부 복잡한 작업을 캡슐화 할 수 및 데이터 계층은 데이터가 레디 스에 전략을 모델링에 대한 걱정없이 원자 쓰기 작업을 수행합니다.

    당신이 빠른하지만 복잡한 읽기 작업을 수행 할 때 또한, 나는 그들에게 유용. 예를 들어, 당신은 순서대로 객체를 얻을 수도 있습니다. 순서가 정렬 된 세트의 키에 의해 정의되는 동안 객체들은 해시 키에 저장된다. 당신은 소위 소트 세트의 범위를 얻을 당신은 hmget를 사용하여 해시 개체를 얻을.

    가장 중요한 점은 루아 스크립트 레디 스를 루아 스크립트가 실행되는 동안 다른 작업을 차단하기 때문에, 가능한 한 빨리 실행할 수있는 일들을 구현해야합니다. 즉, 당신은 많이 감소 빠른 중단 또는 전체 레디 스의 성능을 수행해야합니다.

    난 당신이 정말 필요할 때 당신이 그들을 사용해야한다고 주장한다. 일반적으로, 클라이언트는 C #을, 자바, 자바 스크립트, 루비와 같은 높은 수준의 프로그래밍 언어를 사용하여 개발 ... 그들은 더 나은 개발 경험 제공 : 좋은 디버거, IDE, 코드 완성을 ...

    요약 : 당신은 레디 스 루아 스크립트에 도메인 로직의 일부를 설정 한 경우 실제 혜택 (성능)가 있음을 입증 할 수있는 경우에 당신이 그들을 사용해야합니다.

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

    2.레디 스의 루아 스크립트의 또 하나의 단점이있다 : 당신은 그들이 동일한 물리적 서버에 있는데도 레디 스의 또 다른 인스턴스에 작업을 발행 할 수 없습니다. 그것은 모든 CPU 코어를 활용 한 서버에서 레디 스의 여러 인스턴스를 실행하는 것이 일반적입니다. 그래서 당신은 클라이언트에서 레디 스의 여러 인스턴스를 제어 할 수 있습니다.

    레디 스의 루아 스크립트의 또 하나의 단점이있다 : 당신은 그들이 동일한 물리적 서버에 있는데도 레디 스의 또 다른 인스턴스에 작업을 발행 할 수 없습니다. 그것은 모든 CPU 코어를 활용 한 서버에서 레디 스의 여러 인스턴스를 실행하는 것이 일반적입니다. 그래서 당신은 클라이언트에서 레디 스의 여러 인스턴스를 제어 할 수 있습니다.

    위에서 말한 모든 것을 요약하면 :

    즉, 레디 스 응용 프로그램 서버가 아닙니다. 당신은 쉽게 루아에 원하는 로직을 작성하고 있는지 모든 것이 괜찮아이라고하지 않을 수 있습니다.

    당신이되는 NoSQL 데이터베이스 내에서 실제 응용 프로그램 서버가 필요 경우, 예를 들어 Tarantool을 시도합니다. 또한 루아 스크립트를 가지고 있지만, 차이는 그들이 여전히 한 ACID 트랜잭션으로 실행하고, 서로를 차단하지 않습니다 (외부 요청을하지 않는 경우) 그리고 그들은 당신이 원하는 어떤 부작용을, 심지어 문제를 할 수 있다는 것입니다 Tarantool 또는 레디 스 같은 외부 데이터베이스에 대한 요청이나는 HTTP 요청을한다. 어떤 별도의 섬유와 루아 스크립트에 의해 수행되는 모든 변경 사항의 행 기반 복제 각 루아 스크립트를 실행하여 얻을 수있다.

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

    3.루아는 좋은 우리는 어떤 상황에서 그것을 사용 - 우리가 어떤 원자 작업이 발생하고 싶었 특히,하지만 경우에 당신이 문제 루아 스크립트에 위의 코드를 변환 레디 스에 실행을해야합니다. 그리고 그 때문에이 라인의이다 :

    루아는 좋은 우리는 어떤 상황에서 그것을 사용 - 우리가 어떤 원자 작업이 발생하고 싶었 특히,하지만 경우에 당신이 문제 루아 스크립트에 위의 코드를 변환 레디 스에 실행을해야합니다. 그리고 그 때문에이 라인의이다 :

    var timestmp = Date.now();
    

    이 같은 선 후에는 기본적으로 마스터 - 슬레이브 복제가 레디 스에서 처리하는 방법 때문에 더 이상 SET 작업을 수행 할 수 없습니다. 여기를보세요 : http://redis.io/commands/eval#scripts-as-pure-functions 이것은 루아 스크립트를 사용에 대한 또 하나 개의 인수 같다.

  4. ==============================

    4.TL; DR : (이를 위해) 루아 스크립트를 사용하지 않는

    TL; DR : (이를 위해) 루아 스크립트를 사용하지 않는

    약간 긴 : 레디 스 '루아 스크립트 의미론 스크립트에 의해 사용 된 키 (키'어레이 사용)의 인수로서 제공되어야한다는 코드 및 상태를 통해 키 이름을 생성 대해 부른다.

    긴 여전히 : http://redis.io/commands/eval에서 인용 참조

  5. ==============================

    5.루아 스크립트는 정말 강력합니다. 당신이 올바르게 설명한 바와 같이, 그것은 레디 스 서버와 클라이언트 사이의 한계 네트워크 왕복 할 수 있습니다. 또한,이 String로서 모든 시간을 스크립트를 전송하지 않습니다 만 SHA1은 아주 작은 첫 번째 호출, 이후에 전송해야합니다.

    루아 스크립트는 정말 강력합니다. 당신이 올바르게 설명한 바와 같이, 그것은 레디 스 서버와 클라이언트 사이의 한계 네트워크 왕복 할 수 있습니다. 또한,이 String로서 모든 시간을 스크립트를 전송하지 않습니다 만 SHA1은 아주 작은 첫 번째 호출, 이후에 전송해야합니다.

    모범 사례 루아에 있습니다 : 당신이 데이터를 사용하거나 복제를 샤딩있는 별도의 루아 스크립트로 확인 될 경우 "읽기 전용"실제로 (그들이 마스터에서 실행해야합니다) 클러스터에 쓰기 것들에서.

    계산은 루아 호출하기 전에, 모든 키 당신은 (레디 스에 포함) 루아에서 기본적으로 바르, 해당 시간 관련 값은 외부 루아를 계산하는 의미 또한 관련된 시간에 대한 액세스를하지 않는, 레디 스에 필요. 일반적으로 단지 레디 스 및 제한 네트워크 활동에 대한 일괄 작업에 사용, 작업 외부의 루아의 대부분을하는 것이 좋습니다.

    마지막으로, 루아 시간 초과 (당신이 레디 스에서 그것을 덮어 쓸 수 있습니다) 정말 조심하세요. 루아 실행이 레디 스 인스턴스에서 차단되기 때문에 그것을 실행하는 데 시간이 너무 오래이거나 모든 둔화 얻을 것이다 (당신의 알고리즘 "분할과 정복은"이런 식으로 설계)하지 않아야하므로, 그것은 중지 - 더 - 세계 동작입니다.

    또한 임계 문제가 나타날 수 있습니다 고려 루아 스크립트에서 레디 스 키를 청소. 그것은 (프로세스에 너무 많은 키 / 작업) 너무 오래 걸린다면 그것은 루아 시간 초과로 인해 실패합니다. 그런 다음 데이터로 인해 활동 레디 스에서 성장한다. 당신이 루아 깨끗한하려고 다음 번에, 청결 레디 스를 위해 더 많은 키를 처리 할 것이다, 그 결과로 성공하는 적은 기회가있다! 당신은 때문에 루아 타임 아웃의 메모리 부족을 얻을 수 ...

  6. from https://stackoverflow.com/questions/30869919/redis-lua-when-to-really-use-it by cc-by-sa and MIT license