1

我是 Cassandra 的新手,我开始设计一个简单的用户表用于帐户注册和登录目的。这很简单:

行键:用户名;列:电子邮件、姓名、密码、盐。
或者:
行键:uuid;列:用户名、电子邮件、姓名、密码、盐。

关于这个简单的结构,我有两个问题:

  1. 我需要一个用于查找电子邮件(和用户名)的索引。我可以使用二级索引或手动创建索引。由于电子邮件/用户名列的基数很高,我应该选择第二个选项吗?显然二级索引适用于低基数列。
  2. 更重要的是,我立即遇到了同时向表中插入键的问题——我需要先读后写以确保用户名(或电子邮件)不在数据库中。有没有办法避免潜在的竞争条件(例如两个用户同时注册相同的用户名/电子邮件)?还是使用额外的关系数据库来处理用户注册并将用户帐户详细信息复制到 cassandra 数据库以用于登录和其他目的的正确解决方案?
4

1 回答 1

2
  1. 是的,出于您陈述的原因,您需要创建自己的索引。电子邮件和用户名将是唯一的,因此不适合二级索引。

  2. 在任何需要唯一值的情况下,您都必须在写入之前读取。由于两个用户同时选择相同用户名的情况可能很少见(取决于您的流量),您可以交叉手指并希望它有效。或者,您可以遵循以下流程:

    • 阅读以检查用户是否存在
    • 如果它不存在,请写入记录并保留您使用的时间戳
    • 再次读取用户并比较时间戳
    • 如果时间戳不正确(暗示遵循相同流程的其他人覆盖了第一条记录),提示用户提供不同的名称

#2 中的流程将具有在时间窗口内写入相同用户名的第二个用户将获胜的效果,但我认为这没关系,只要您告诉至少一个用户该名称已被使用。

于 2013-02-21T20:49:04.093 回答