복붙노트

[REDIS] 레디 스 및 시계 + 다중 동시 사용자 수

REDIS

레디 스 및 시계 + 다중 동시 사용자 수

나는 웹 서비스에 대해 동일한 이메일 주소로 사용자 가입에 대한 부하 테스트를하고있어 동시에 연결할 처음 10 사용자는 항상 등록합니다.

나는 시계 및 MULTI을 사용하고 있지만 어떤 방식으로 작동하지 않는 것 같습니다.

() 사용자를 저장합니다 내가 전화 드렸습니다.

this.insert = function(callback) {
    this.preInsert();

    created = new Date();
    updated = new Date();

    // Also with these uncommented it still doesn't work
    // Common.client.watch("u:" + this.username);
    // Common.client.watch("em:" + this.email);

    console.log(ID + " email is locked " + this.email);
    Common.client.multi()
    .set("u:" + this.username, ID)
    .hmset("u:" + ID, 
        {"username": this.username
        ,"password": this.password
        ,"email": this.email
        ,"payment_plan": payment_plan
        ,"created": created.getTime()
        ,"updated": updated.getTime()
        ,"avatar": this.avatar})
    .zadd("u:users", 0, ID)
    .sadd("u:emails", this.email)
    .set("u:"+ ID + ":stats", 0)
    .set("em:" + this.email, ID)
    .exec();

    this.postInsert();

    if (callback != null)
        callback(null, this);
}

this.save = function(callback) {
    // new user
    if (ID == -1) {
        var u = this;

        Common.client.watch("u:" + this.username);
        Common.client.exists("u:" + this.username, function(error, exists) {
            // This username already exists
            if (exists == 1) {
                Common.client.unwatch();
                if (callback != null)
                    callback({code: 100, message: "This username already exists"});
            }
            else {
                Common.client.watch("em:" + u.email);
                Common.client.get("em:" + u.email, function(err, emailExists) {
                    if (emailExists != null) {
                        Common.client.unwatch();
                        if (callback != null)
                            callback({code: 101, message: "This email is already in use"});
                    }
                    else {
                        Common.client.incr("u:nextID", function(error, id) {
                            if (error) callback(error);
                            else {
                                ID = id;
                                u.insert(callback);
                            } 
                        });
                    }
                });
            }
        });
    }
    // existing user
    else {
        var u = this;
        Common.client.get("em:" + this.email, function(err, emailExists) {
            if (emailExists != ID && emailExists) {
                if (callback != null) {
                    callback({code: 101, message: "This email is already in use " + ID + " " + emailExists});
                }
            }
            else {
                u.update(callback);
            }
        });
    }
}

출력은 거의 항상 :

1 email is locked test@test.com
2 email is locked test@test.com
3 email is locked test@test.com
4 email is locked test@test.com
5 email is locked test@test.com
6 email is locked test@test.com
7 email is locked test@test.com
8 email is locked test@test.com
9 email is locked test@test.com
10 email is locked test@test.com

내가 그 많은 동시성을 처리 할 수없는 뭔가 잘못 또는 레디 스를하고있는 중이 야. 또한이 공통의 정의는 다음과 같습니다

var Common = {
    client: redis.createClient(),
...
};

해결법

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

    1.예! 물론 밤의 휴식 후 해결책은 샤워 나에게왔다.

    예! 물론 밤의 휴식 후 해결책은 샤워 나에게왔다.

    문제는 내가 모든 응용 프로그램에 대해 하나의 레디 스 스레드를 사용하고 모든 연결은 해당 스레드에 시계를 등록이었다. 물론 그것은 다른 클라이언트가 없었기 때문에 키가 다른 클라이언트에 의해 수정 된 것을 통지하지 않았다.

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

    2.나는이 스레드가 8 개월 알지만, 어쨌든, 내 생각은 여전히 ​​사람을 도울 수 있습니다. 나는 아직도 이해할 수없는 문제가있다, 난 내가 당신을 참조 하나의 클라이언트에 의해이 문제 레디 스 시계 MULTI EXEC에 전념 내 자신의 스레드를 시작했다. 내가 지금은 시계-MULTI-EXEC와 거래를 할 필요하면 새로운 연결을 생성 수단 "거래 당 연결"방법을 사용합니다. 원자 작업을위한 다른 경우에는 내가 앱 실행 중에 생성되는 연결을 사용합니다. + 권한을 부여를 만드는 새로운 연결 수단을 만들기 때문에 확실하지이 방법은 효과적이며, 이는 대기 시간이 발생하지만 작동합니다.

    나는이 스레드가 8 개월 알지만, 어쨌든, 내 생각은 여전히 ​​사람을 도울 수 있습니다. 나는 아직도 이해할 수없는 문제가있다, 난 내가 당신을 참조 하나의 클라이언트에 의해이 문제 레디 스 시계 MULTI EXEC에 전념 내 자신의 스레드를 시작했다. 내가 지금은 시계-MULTI-EXEC와 거래를 할 필요하면 새로운 연결을 생성 수단 "거래 당 연결"방법을 사용합니다. 원자 작업을위한 다른 경우에는 내가 앱 실행 중에 생성되는 연결을 사용합니다. + 권한을 부여를 만드는 새로운 연결 수단을 만들기 때문에 확실하지이 방법은 효과적이며, 이는 대기 시간이 발생하지만 작동합니다.

  3. from https://stackoverflow.com/questions/11832637/redis-and-watch-multi-allows-concurrent-users by cc-by-sa and MIT license