snowflake生成算法 = time(41bits)-machine id(10bits)-seqnumber(12bits),使用time排序也可以认为是相对有序的。Twitter主要考虑uuid(128bits)过长,所以创造了snowflake id(63bits)。需要说明的是snowflake 并非完全意义分布式,macheine id(10bits)标明最多只能有1024台机器同时产生ID,sequence number(12bits)也标明1台机器1ms中最多产生4096个ID,这些对于twitter来说已经足够了。51Testing软件测试网'Dnnc|G!YxbP@
51Testing软件测试网Q?
Xe7Y_G;_J
其实有种做法最简单也最高效。预料会有1W台机器,Long型的最大值是19位整数,就把Long型的范围划分成1w个区间,用mysql的自增ID来当主键。
id2k:{8X8FBB0@"I2k0
facebook的用户ID是long型,但不知道怎么样生成的。
-zy8f)H
i+v+^Q2p0
(Lu}Q d?m-W4a+}0
新浪微薄用的是redis51Testing软件测试网6K9S.F(y4]e.[1nKh|
t:v4MTHb0
以后多库的话会是灾难的。只能说每个表有用自增ID做主键,用UUID做逻辑主键。我现在是这样做的。
3Z
X%X
oF0
B&PSk2Rh~-k0
不对UUID整个做索引,只索引前N个字符呢,效果会不会好点。这样索引大小会小很多。51Testing软件测试网AX3AhL7R
51Testing软件测试网/ce7B*r Q7W.U[
我一直都在找一种比较好的ID生成方式。现在我们用的是UUID,它虽然满足以后的分库与扩展,但基于它做查询绝对不是最好的。而且去符号后,它是32位比较占内存,又无规律。对于mysql来说,影响很大。51Testing软件测试网8`7h){a4C
51Testing软件测试网-?5{w
T[*?;a
因为是组合形式,如果采用(分库ID+自增ID)有可能会超过Long范围,所以用字符串会好一些。。我的猜测
^4V zH{.C,{6I;K0
51Testing软件测试网:c)}#_ pD
这是新浪微博SDK用例,看着好像是字符串形式。51Testing软件测试网|/m)D!UhB'u7|
ZGF9E Zc0
package weibo4j.examples;
Ogl-X4X)nXE(}f1_0
51Testing软件测试网)_5J1}'uoK
import weibo4j.User;51Testing软件测试网!K+bmGy&Q.F
import weibo4j.Weibo;
E dBXw
U
{ns0
import weibo4j.WeiboException;
$Q"[1g!H9@Nc0
3g#fmX6Sd0
public class GetUserInfo {51Testing软件测试网~&d7u(H,hW(OU:x'@X
;Z
JJ8a%iI1b0
/**
3z2he
UGn1A)kFH0
* 根据用户ID获取用户资料(授权用户) 51Testing软件测试网3a0J+UTs+xd
* @param args51Testing软件测试网XZu?e x(di
*/
o1~dS;l^e0
public static void main(String[] args) {
9jd[1j@1NIV8Ed0
System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY);
7?a?P Y,Fd%`0
System.setProperty("weibo4j.oauth.consumerSecret", Weibo.CONSUMER_SECRET);
|c1L5p\0
try {51Testing软件测试网IbT&h
_F3P
User user = getWeibo(true,args).showUser(args[2]);51Testing软件测试网lcP$b2k^Ka~{
System.out.println(user.toString());51Testing软件测试网}4\cR"Y-v?F*y
} catch (WeiboException e) {51Testing软件测试网4K6[(Ig:Esk
e.printStackTrace();
-V$b|1lD)aW{G0
}51Testing软件测试网t"c#p%^7Nn#Z\
}51Testing软件测试网OH8iP$g$]Qo,^:}
+m%[H#i1?4pZcp!o&E0
private static Weibo getWeibo(boolean isOauth,String[] args) {51Testing软件测试网R!NZ6{;R7GoyW V
Weibo weibo = new Weibo();51Testing软件测试网/C@B;k(Z?
if(isOauth) {//oauth验证方式 args[0]:访问的token;args[1]:访问的密匙
z
G
kd*h$S h0
weibo.setToken(args[0], args[1]);51Testing软件测试网4Pmv&A
Uu/D3j%r
}else {//用户登录方式
*_A.G%d6v0
weibo.setUserId(args[0]);//用户名/ID
C3XL,A(j};V0
weibo.setPassword(args[1]);//密码
X&eS!QZxv9x;~W0
}
"fhJ.c+_
x6h0
return weibo;51Testing软件测试网3z]}6bev+e~!bZ
}51Testing软件测试网{6o,H-NEq*Qo
51Testing软件测试网:z5Mh9o/BY?
刚才想了一下,分库ID+递增ID还是有缺陷。
h$d#Gq Q0
%Z4o4Y3CsO&r)Lb0
http://weibo.com/2276408980/profile/51Testing软件测试网1tVpI1Z?
我觉得不是。上面是我的首页,'2276408980'应该就是我的ID号。显然它不是UUID。
,R[P;o4C;d0
51Testing软件测试网 c$a%Mb
Ka9@
请问一下,类似于新浪微博这样的大用户量平台,用户ID是怎么生成的?
7}H!f#bKr0
51Testing软件测试网,hs-RhU}
http://www.infoq.com/cn/articles/yupoo-partition-database51Testing软件测试网3Bk(x,b~_P