【问题标题】:Checking username availability - Handling of AJAX requests (Google App Engine)检查用户名可用性 - 处理 AJAX 请求(Google App Engine)
【发布时间】:2015-02-24 17:31:07
【问题描述】:

我想使用 AJAX 在我的注册页面上添加“检查可用用户名”功能。我对我应该如何实施它没有任何疑问。

  1. 我应该使用哪个事件来注册我的 AJAX 请求?我们可以发送 当用户焦点离开“用户名”输入字段时请求(模糊 事件)或在他键入时(keyup 事件)。哪个提供更好的用户 经验?

  2. 在服务器端,处理请求的一种简单方法是 查询我的主要“帐户”数据库。但这可能会导致很多 请求命中我的数据库(如果我们使用 keyup POST 则更多) 事件)。我应该为注册的用户名维护一个单独的模型吗 只用它来获得更好的结果?

  3. 在这种情况下是否可以使用 Memcache?初始化缓存 每个用户名都作为密钥并在我们注册用户时更新它并使用 随机键检查缓存是否实际初始化或通过 直接查询 db。

【问题讨论】:

    标签: python ajax google-app-engine memcached google-cloud-datastore


    【解决方案1】:

    答案-

    1. 检查模糊。如果您在键入时执行此操作,您将用不必要的查询敲打您的服务器,让尚未完成输入的用户感到烦恼,并且无论如何都可能延迟输入。
    2. 如果您的 Account 实体非常大,您可能希望创建一个单独的 AccountName 实体,并在您创建真实帐户时创建一个匹配的此类实体(但这可能是不必要的优化)。创建帐户(或帐户名称)时,请务必在创建时指定 id=name。然后你可以做一个 AccountName.get_by_id(name) 来快速查看 AccountName 是否已经被分配,如果最近被处理,它会自动从 memcache 中拉取。
    3. 默认情况下,GAE NDB 会在您放置或获取实体时自动为您填充内存缓存。如果您在第 2 步中遵循我的建议,事情会非常快,并且您不必为预先填充 memcache 搞砸。

    如果您担心 2 个人同时请求相同的用户名,请将您的 create 方法放在事务中:

    @classmethod
    @ndb.transactional()
    def create_account(cls, name, other_params):
        acct = Account.get_by_id(name)
        if not acct:
            acct = Account(id=name, other param assigns)
            acct.put()
    

    【讨论】:

    • 谢谢!我切换到了 blur 事件,因为 keyup 事件对于注册来说有点矫枉过正。此外,+1 用于提醒使用 get_by_id 和 create_account 作为类方法。不过,由于我不知道 Google 的自动缓存是如何工作的,所以我仍然将我的 memcache 填充为一个额外的层。
    【解决方案2】:

    我会推荐用户名字段的模糊事件,结合某种内联错误/警告显示。

    我还建议维护已注册用户名的内存缓存,以减少数据库命中并改善用户体验 - 尽管可能不会通过热身来填充它,而是仅在发出请求时填充。这有时被称为“存储库”模式。

    但是,您只能使用 USED 用户名填充缓存 - 您不应在此处存储“可用”用户名(或者如果这样做,请使用低得多的超时时间)。

    在实际执行注册时,您应该始终直接检查数据库/数据存储。理想情况下,采用某种交易方法,这样您就不会出现多人注册的竞争条件。

    但是,所有这些工作都取决于几件事,包括您的应用程序有多忙以及您使用的数据存储技术!

    【讨论】:

    • 我正在使用 App Engine 数据存储区(问题标签中提到了它,但我将编辑并添加有问题的内容)。在这种情况下我们应该如何处理陈旧的缓存。如果 2 个用户尝试使用相同的用户名注册,一个被注册,另一个被 db 拒绝(尽管我们的缓存查询说用户名可用)?这是一个可以接受的使用 memcache 的怪癖吗?
    • 如前所述,我建议您只缓存“使用过的”用户名。这意味着比赛条件将是罕见的。如果您在事务块中进行实际创建,那么您将不允许创建 2 个具有相同名称的用户。
    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多