我正在用戶註冊時使用同一個web服務的電子郵件地址進行負載測試,同時連接的前10個用戶將始終註冊。redis和watch + multi允許併發用戶
我正在使用WATCH和MULTI,但似乎沒有任何工作方式。
我打電話給save()來保存用戶。
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 [email protected]
2 email is locked [email protected]
3 email is locked [email protected]
4 email is locked [email protected]
5 email is locked [email protected]
6 email is locked [email protected]
7 email is locked [email protected]
8 email is locked [email protected]
9 email is locked [email protected]
10 email is locked [email protected]
難道我做錯了什麼或Redis的無法處理這麼大的併發性。 另外這是普通的定義:
var Common = {
client: redis.createClient(),
...
};
yay陣雨 – Roest 2012-08-07 17:06:37