产品的质量依赖于过程的质量, 而过程的质量依赖于企业文化和管理! 欢迎大家来到我的小窝~!

关于生成id的讨论

上一篇 / 下一篇  2011-08-03 09:12:48 / 个人分类:DBA

snowflake生成算法 = time(41bits)-machine id(10bits)-seqnumber(12bits),使用time排序也可以认为是相对有序的。Twitter主要考虑uuid(128bits)过长,所以创造了snowflake id(63bits)。需要说明的是snowflake 并非完全意义分布式,macheine id(10bits)标明最多只能有1024台机器同时产生IDsequence number(12bits)也标明1台机器1ms中最多产生4096ID,这些对于twitter来说已经足够了。51Testing软件测试网'Dnnc|G!YxbP@

 51Testing软件测试网Q? Xe7Y_G;_ J

其实有种做法最简单也最高效。预料会有1W台机器,Long型的最大值是19位整数,就把Long型的范围划分成1w个区间,用mysql的自增ID来当主键。

id2k:{8X8FBB0@"I2k0

facebook的用户IDlong型,但不知道怎么样生成的。

-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软件测试网/c e7B*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!Uh B'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?ex(di

 */

o1~ dS;l ^e0

public static void main(String[] args) {

9jd[1j@1NIV8Ed0

System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY);

7?a? PY,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 |1l D)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{;R7Go yWV

Weibo weibo = new Weibo();51Testing软件测试网/C@B;k(Z?

if(isOauth) {//oauth验证方式 args[0]:访问的tokenargs[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

 

%Z4o4Y3Cs O&r)Lb0

http://weibo.com/2276408980/profile/51Testing软件测试网1tV pI1Z?

我觉得不是。上面是我的首页,'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


TAG:

 

评分:0

我来说两句

日历

« 2024-04-23  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 50766
  • 日志数: 65
  • 文件数: 1
  • 建立时间: 2010-11-23
  • 更新时间: 2011-10-18

RSS订阅

Open Toolbar