2

以前我使用在这里找到的类将 userID 转换为一些随机字符串。

从他的博客:

跑步:

alphaID(9007199254740989);

将返回 'PpQXn7COf' 并且:

alphaID('PpQXn7COf', true);

将返回“9007199254740989”

所以这个想法是用户可以做 www.mysite.com/user/PpQXn7COf 我把它转换成一个普通的整数,这样我就可以在 mysql 中做

"Select * from Users where userID=".alphaID('PpQXn7COf', true)

现在我刚刚开始与 Cassandra 合作,我正在寻找一些替代品。

  1. 我想要像 www.mysite.com/user/PpQXn7COf 这样的网址,而不是像 www.mysite.com/user/username1
  2. “PpQXn7COf”uuid 必须尽可能短。

在此处解释的 Twissandra 示例中:http ://www.rackspace.com/cloud/blog/2010/05/12/cassandra-by-example/

他们创建了一些很长的 uuid(我猜它很长,因为它几乎 100% 确定它是随机的)。

在 mysql 中,我只有一个自动增加的 userID 列,所以当我使用 alphaID() 函数时,我总是得到一个非常短的随机字符串。

有人知道如何尽可能干净地解决这个问题吗?


编辑:

它用于社交媒体网站,因此它必须是持久的。这也是为什么我不想在 url 中使用用户名/实名,如果他们需要,用户不能保持谷歌未被检测到。

我只是有一个简单的想法,但是我不知道它的可扩展性如何

<?php
//createUUID() makes +- 14 char string with A-Z a-z 1-0 based on micro/milli/nanoseconds
while(get_count(createUUID()) > 0){//uuid  is unique
  //insert username pass, uuid etc into cassandra
  if($result == "1"){
      header('Location: http://www.mysite.com/usercenter');
  }else{
      echo "error";
  }
}
?>

当它达到让我们说 twitter/facebook 的大小时:

  1. 它会在可接受的时间内执行吗?
  2. 它是否仍然会足够快地生成唯一的 uuid,所以如果 10000 个用户/秒正在注册它不会混乱?
4

1 回答 1

4

自动增量不适用于健壮的分布式系统。如果系统中的每个节点都可用,您只能分配一个唯一 ID,以确保它是唯一的。

当然,您可以发明自己的唯一 ID 生成器,但您必须确保它会在您的基础架构中的任何位置生成唯一 ID。

例如,每个节点可以只有一个文件,它(具有适当的锁定等)只是增加,但您还需要确保它们不会冲突 - 例如,通过将服务器 ID 包含在生成算法中。

这在操作上可能很重要——您的操作工程师需要确保基础设施中的所有服务器都正确配置,并设置了自己的 ID 生成器,这样它们就不会生成相同的 ID。但是,这是可能的。

UUID 是合理的选择,因为它们肯定是唯一的。

UUID 是 128 位;如果我们每个字符存储 6 位(即 base64),那么需要 22 个字符,这是一个相当长的 URI。如果您希望它更短,则需要以不同的方式生成唯一 ID。

此外,这一切都取决于您实际需要您的 ID 的“独特性”。如果您的 ID 可以在几个月后安全地重复使用,您可能可以在 < 60 位内完成此操作(还取决于您的基础架构中的服务器数量,以及您需要生成它们的频率)。

我们用

  • 服务器编号
  • 时间(粒度 = 2 秒),但几个月后结束
  • 每个服务器的计数器(经常换行,但不是在 2 秒内)

并将所有部分粘在一起。这会生成一个 < 64 位长的 ID,但保证在所需的时间长度内是唯一的(在我们的例子中只有几个月)


如果出现以下情况,我们的算法将出现故障并生成重复的 ID:

  • 我们的一个节点上的系统时钟倒退的时间与计数器回绕的时间相同。
  • 我们的运维工程师犯了一个错误,将相同的服务器 ID 分配给了两台服务器。
  • 最终,大约9个月后。
于 2011-04-16T14:03:47.530 回答