[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.예! 물론 밤의 휴식 후 해결책은 샤워 나에게왔다.
예! 물론 밤의 휴식 후 해결책은 샤워 나에게왔다.
문제는 내가 모든 응용 프로그램에 대해 하나의 레디 스 스레드를 사용하고 모든 연결은 해당 스레드에 시계를 등록이었다. 물론 그것은 다른 클라이언트가 없었기 때문에 키가 다른 클라이언트에 의해 수정 된 것을 통지하지 않았다.
-
==============================
2.나는이 스레드가 8 개월 알지만, 어쨌든, 내 생각은 여전히 사람을 도울 수 있습니다. 나는 아직도 이해할 수없는 문제가있다, 난 내가 당신을 참조 하나의 클라이언트에 의해이 문제 레디 스 시계 MULTI EXEC에 전념 내 자신의 스레드를 시작했다. 내가 지금은 시계-MULTI-EXEC와 거래를 할 필요하면 새로운 연결을 생성 수단 "거래 당 연결"방법을 사용합니다. 원자 작업을위한 다른 경우에는 내가 앱 실행 중에 생성되는 연결을 사용합니다. + 권한을 부여를 만드는 새로운 연결 수단을 만들기 때문에 확실하지이 방법은 효과적이며, 이는 대기 시간이 발생하지만 작동합니다.
나는이 스레드가 8 개월 알지만, 어쨌든, 내 생각은 여전히 사람을 도울 수 있습니다. 나는 아직도 이해할 수없는 문제가있다, 난 내가 당신을 참조 하나의 클라이언트에 의해이 문제 레디 스 시계 MULTI EXEC에 전념 내 자신의 스레드를 시작했다. 내가 지금은 시계-MULTI-EXEC와 거래를 할 필요하면 새로운 연결을 생성 수단 "거래 당 연결"방법을 사용합니다. 원자 작업을위한 다른 경우에는 내가 앱 실행 중에 생성되는 연결을 사용합니다. + 권한을 부여를 만드는 새로운 연결 수단을 만들기 때문에 확실하지이 방법은 효과적이며, 이는 대기 시간이 발생하지만 작동합니다.
from https://stackoverflow.com/questions/11832637/redis-and-watch-multi-allows-concurrent-users by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 분석을위한 주요 계획을 레디 스 (0) | 2020.01.26 |
---|---|
[REDIS] 레디 스 하드 오류가 발생할 경우 클러스터에 어떻게 특정 노드의 해시 슬롯을 다시 시작하려면? (0) | 2020.01.26 |
[REDIS] 레디 스가 다운되면 캐싱 사용 안 레일 (0) | 2020.01.26 |
[REDIS] 리눅스에 대한 2.8.7 감시 환경 구성 질문 레디 스, 그것은 자동으로 시작하는 방법을 만들기 위해, 무엇을 가입해야합니까? (0) | 2020.01.26 |
[REDIS] 모든 요청 익스프레스 변경 세션 (0) | 2020.01.26 |