t*******u 发帖数: 6 | 1 要create一个tinyUrl一般的做法都是生成一个数字的ID,然后把这个数字转换成[0-9]
[a-z][A-Z]的shortUrl
问题是如何生成这个数字ID呢?可以维持一个counter每次create tinyUrl就加1。但是
这样的话怎样distribute create到很多server上?
求大神指点 |
z*********8 发帖数: 2070 | 2 timestamp + machine id + local counter + anything else appropriate |
t*******u 发帖数: 6 | 3
这样的话会是一个很长的id,怎样把它转成一个7-8个char的shortUrl呢?
【在 z*********8 的大作中提到】 : timestamp + machine id + local counter + anything else appropriate
|
w*****1 发帖数: 6807 | 4 7-8个char组合起来数值很大的,62 base,这样做问题不大
【在 t*******u 的大作中提到】 : : 这样的话会是一个很长的id,怎样把它转成一个7-8个char的shortUrl呢?
|
z*********8 发帖数: 2070 | 5 事实上这是个很常见的follow up: 对于1 billion requests, 以上每个segment大概
需要多少位数? 合并之后什么数据类型可以hold? 转化为62进制后需要几个字符?
【在 t*******u 的大作中提到】 : : 这样的话会是一个很长的id,怎样把它转成一个7-8个char的shortUrl呢?
|
l****u 发帖数: 1764 | 6 为什么是62 base啊? 大写26+小写26+数字10?
url一般都是case sensitive吧,比如这个网站上生成的tiny url,替换大小写也work
http://tinyurl.com/ |
t*******u 发帖数: 6 | 7
1 billion request大概是10K rps,可以分到50个partition上,每个200rps
所以可以用3个digit来表示partition id。
timestamp大概10个digit。
这样的话就13个digit了,可以用string来hold。但是还没加local counter。
62进制8字符大概14digit,这样就没有local counter的空间了。
为什么一定要加time stamp呢?不能直接就partition id + local counter吗?
【在 z*********8 的大作中提到】 : 事实上这是个很常见的follow up: 对于1 billion requests, 以上每个segment大概 : 需要多少位数? 合并之后什么数据类型可以hold? 转化为62进制后需要几个字符?
|
z*********8 发帖数: 2070 | 8 timestamp, machine id, local counter都是数字, 为什么要用string来hold呢?
不能直接就partition id + local counter的原因: 因为机器或者local counter
process会crash, 所以local counter会reset, 从而返回同样的值
【在 t*******u 的大作中提到】 : : 1 billion request大概是10K rps,可以分到50个partition上,每个200rps : 所以可以用3个digit来表示partition id。 : timestamp大概10个digit。 : 这样的话就13个digit了,可以用string来hold。但是还没加local counter。 : 62进制8字符大概14digit,这样就没有local counter的空间了。 : 为什么一定要加time stamp呢?不能直接就partition id + local counter吗?
|
z*********8 发帖数: 2070 | 9 是case sensitive的, 所以大小写就有52种可能, 这是w3定义的: https://www.w3.
org/TR/WD-html40-970708/htmlweb.html
work
【在 l****u 的大作中提到】 : 为什么是62 base啊? 大写26+小写26+数字10? : url一般都是case sensitive吧,比如这个网站上生成的tiny url,替换大小写也work : http://tinyurl.com/
|
t*******u 发帖数: 6 | 10
明白了
那这样的话就用long来hold。10个digit的timestamp + 3个digit的partition id +
local counter4个digit,一共17个,需要10个char的shorturl。这样算对吗?
【在 z*********8 的大作中提到】 : timestamp, machine id, local counter都是数字, 为什么要用string来hold呢? : 不能直接就partition id + local counter的原因: 因为机器或者local counter : process会crash, 所以local counter会reset, 从而返回同样的值
|
|
|
m******e 发帖数: 82 | 11
50年后的今天timestamp=1576800000,2进制31位即可表示
1. 如果tiny url只有6个字符,最多能表示56800235584种可能,2进制大概36位,用5
位表示partition id+local counter,貌似不充裕
2. 7个字符,2进制42位,除去timestamp还有11位,就是说每秒支持2046个url,差不多
3. 8个字符,2进制48位,除去timestamp还有17位,每秒支持131072,完全充足了
【在 t*******u 的大作中提到】 : : 明白了 : 那这样的话就用long来hold。10个digit的timestamp + 3个digit的partition id + : local counter4个digit,一共17个,需要10个char的shorturl。这样算对吗?
|
a*********0 发帖数: 2727 | 12 1 billion request和10k是什么关系?
【在 t*******u 的大作中提到】 : : 明白了 : 那这样的话就用long来hold。10个digit的timestamp + 3个digit的partition id + : local counter4个digit,一共17个,需要10个char的shorturl。这样算对吗?
|
y***g 发帖数: 1492 | 13 多个server的话 在shorturl左边多加一位 用来标定server
long-》short 用一个hash%62来决定这一位 存在对应的server
short-》long 根据这一位找到对应的server做查询
9]
【在 t*******u 的大作中提到】 : 要create一个tinyUrl一般的做法都是生成一个数字的ID,然后把这个数字转换成[0-9] : [a-z][A-Z]的shortUrl : 问题是如何生成这个数字ID呢?可以维持一个counter每次create tinyUrl就加1。但是 : 这样的话怎样distribute create到很多server上? : 求大神指点
|
s**********1 发帖数: 12 | |
j**********3 发帖数: 3211 | |
c********t 发帖数: 5706 | 16 换成String才是short url啊
对timestamp不太明白,加上了timestamp以后,还怎么用tiny url search original
url呢?
【在 z*********8 的大作中提到】 : timestamp, machine id, local counter都是数字, 为什么要用string来hold呢? : 不能直接就partition id + local counter的原因: 因为机器或者local counter : process会crash, 所以local counter会reset, 从而返回同样的值
|