Redis和Watch + Multi允许并发用户

我正在使用Web服务的相同电子邮件地址对用户注册进行负载测试,并且同时连接的前10个用户将始终注册。

我正在使用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 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

我是在做错什么,还是redis无法处理那么多的并发。这也是Common的定义:

var Common = {

client: redis.createClient(),

...

};

回答:

是!经过一整夜的休息之后,解决方案终于在淋浴时解决了。

问题是我为整个应用程序使用了一个redis线程,并且所有连接都在该线程上注册了手表。当然,这并不表示密钥是由其他客户端修改的,因为没有其他客户端。

以上是 Redis和Watch + Multi允许并发用户 的全部内容, 来源链接: utcz.com/qa/422193.html

回到顶部