当前位置: 首页 > 面试题库 >

Redis和Watch + Multi允许并发用户

鲁单弓
2023-03-14
问题内容

我正在使用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线程,并且所有连接都在该线程上注册了手表。当然,这并不表示密钥是由其他客户端修改的,因为没有其他客户端。



 类似资料:
  • 问题内容: 我在RedisOnGo + node_redis上使用NodeJS + Express + Redis作为客户端。我期望很多并发,因此尝试测试WATCH。此示例将不包含Express,仅包含必要的内容。 预期的结果 :在exec回调中得到N个错误,最后得到“ inc”变量= 10-N。 意外的结果 :exec回调中出现0个错误,但最终得到“ inc”变量= 1。 观看不适用于我的代码。

  • 问题内容: 我正在使用Redis创建一种算法来声明某个范围内未使用的整数。 此解决方案使用和,并且为了避免出现竞争情况,我也使用/ / 。为了测试并发方面,我创建了一个bash脚本,该脚本同时尝试并行查找10个空闲数字,以调查命令的可能结果。 我发现即使从另一个客户端修改了监视的密钥,也永远不会返回null。我添加了一些延迟,以至于有足够的时间来引发并发修改,这会触发监视机制,从而导致失败,但事实

  • 我主要担心的是,由于使用乐观锁定,当我将有多个进程(比键数多得多,键数只有4个)试图更新值时,事务失败率将非常高。 这是正确的吗?有没有办法防止这种情况发生?

  • null Redis事务是有限的,无法特定键,并且所有键在上都不被监视;我们仅限于给定客户端上的单个正在进行的事务。 我见过许多redis用户声称lua脚本是他们所需要的全部的线程。甚至redis官方文档也表示,他们可能会删除交易,转而支持lua脚本。然而,有些情况下这是不够的,比如最标准的情况:使用redis作为缓存。 假设我们想从Redis中的持久数据存储中缓存一些数据。下面是一个快速的过程:

  • Meteor 的安全系统不需要我们在每次修改数据的时候,在各自的函数里面进行手动检查。 例如,对于一个博客系统,我们常常需要做很多操作,往新帖子上添加属性,当发布帖子的时候进行特定检查。这些操作都是围绕帖子(post)这个对象进行的,所以我们应该为帖子设置一个专门的函数进行安全检查。 但在另一方面,我们又不希望为修改帖子或删除帖子这些简单的操作编写特定的函数。我们只需要在这些操作之前,检查用户是否

  • 我用Spring靴和Spring安全。 我这样添加基于url的安全性 有没有办法只授权get、post、put…在url上担任某些角色?