有没有个比较好点的用户数字ID生成策略

yohoph 2014-05-31 05:01:53
现在公司产品里面的用户都是有个短ID的,类似QQ号码之类。先谈谈需求吧
1.用户ID要保持一定的长度,最好的8位左右。
2.用户ID得是数字
3.内部需要收留一些比较好的数字ID,类似88888888,作为内部保留。原因你们都懂的
4.最后,也是最重要的一点,ID不能重复,最好带有一定的随机性。

上面是我发现出来的功能需求。性能需求的话我觉得应该是至少得在毫秒级并发10个以内请求不会有太明显的压力。
各位要是有什么看法和观点都可以拿出来讨论一下,有现成分享的,当然是最好不过了。
...全文
1615 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Torreson 2016-06-30
  • 打赏
  • 举报
回复
引用 6 楼 ghjhot 的回复:
自动生成8位随机数。 插入数据(设置为唯一)重复会插入失败(重新生成) java随机数算法 http://java-er.com/blog/java-how-to-create-random-number/
这种做法如果用户一多,就会导致到此插入失败了
  • 打赏
  • 举报
回复
自动生成8位随机数。 插入数据(设置为唯一)重复会插入失败(重新生成) java随机数算法 http://java-er.com/blog/java-how-to-create-random-number/
MiceRice 2014-06-03
  • 打赏
  • 举报
回复
速度其实可以跟得上,你要用Sequence的思想来做这个事情。 1、可分配列表固定后,可以用 Insert 。。。。 Select 。。。。 Order By rand() 来得到随机ID列表,结构是: —— int 顺序号, char(8) ID号 2、可以直接用一个Sequence 或 自建字段来维护一个自增序列; 3、每次执行 Select ID From 表 Where 顺序号 = sequenceXXX.next(); 你的总容量也就1亿,客观地说并发高不到哪里去~~~
yohoph 2014-06-03
  • 打赏
  • 举报
回复
引用 3 楼 ldh911 的回复:
8位数能表达1亿范围,如果数据库存储有空余,直接预先生成;然后按规则将部分转移到“保留ID表”中。 如果舍不得那么多空间,可以预先生成6位数的,最前面两位顺序增加;同样生成后按规则将部分转移到“保留ID表”中。
你这倒是提醒了我,不过数据库操作,考虑并发来说我觉得速度可能会跟不上,我现在有一定的思路了 1.按块(区段)把ID生成到服务器内部,放在缓存中。 2.每次请求完ID之后,就把ID放到已经分配的列表中去。分配ID的时候需要预先查询该列表 3.在块区段之外,增设一个全局的保留ID列表。 感觉这种思路应该是可行的。 但是 这样又会带来一个新问题 1.块区段ID是放在内存的,考虑到ID的随机性。每次分配ID的请求算法不好处理 2.如果请求算法分配不妥当,就会造成该块区段ID在分配后期由于有大量的已经分配ID,会有大量的失败情况,直接造成分配效率直线下降。
MiceRice 2014-06-03
  • 打赏
  • 举报
回复
8位数能表达1亿范围,如果数据库存储有空余,直接预先生成;然后按规则将部分转移到“保留ID表”中。 如果舍不得那么多空间,可以预先生成6位数的,最前面两位顺序增加;同样生成后按规则将部分转移到“保留ID表”中。
姜小白- 2014-06-02
  • 打赏
  • 举报
回复
UUID 生成的id不会重复,但是生成的是字符串,不是数字。 Oracle的序列生成的id会按序增长,但不满足随机性,而且内部保留这个不知道怎么处理。 暂时还没想到什么好的解决方案,坐等大牛讨论。
yohoph 2014-06-02
  • 打赏
  • 举报
回复
通常的UUID和自增的ID不是很符合我的需求,我也有点愁。有点思路,但是我现在算法不是很擅长。就有点麻烦

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧