博友们一起来讨论下高并发非自增ID如何设计?

博友们一起来讨论下高并发非自增ID如何设计?

底层是很重要的,我最近设计底层,通用底层。

我想跟大家谈论下这个话题:

如何在高并发环境下设计出一套好用的非自增ID的添加操作的解决方案?更新的操作我随机生成一个时间因子,新增的解决方案就希望大家可以一起讨论下。

打个比方,一个表,一万条新增请求同时涌进来,表为空,也就是一万条同时获取到要赋值的id就是1,更新了第一条,剩下的怎么处理?在第二条处理过程中,又有一万条新增记录涌进来,又如何处理?如何保证性能,ID不重复,友好性?ID列设计为聚集索引主键,数据库不需怎么考虑,要考虑的是程序方面。

(Disruptor并发编程框架,大家可以百度下Disruptor)前几天看了博友的一些并发有关的文章,正好自己也在为这些事情在思考着。

发散下大家的思维,集思广益。下图为我目前想到的解决方案,有漏洞和不完善的请提出,最好有优化方案,或者听听大家的解决方案。放弃自增列是因为很多情况下是多个表的外键,而且自增列很不方便

 

1.减少IO操作

2.避免使用锁,防止死锁和性能不高(需要排队)

3.充分发挥多线程的作用,无需返回结果或操作结果不需考虑的操作,都另外开一个线程处理,从而外部大进程无需等待

4.数据库知识,前端知识熟悉,一件事程序处理是效果不好的,就交由数据库或浏览器处理

作者:小浩
出处:http://www.cnblogs.com/pinhao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 
 
 
绿色通道: 好文要顶 关注我 收藏该文与我联系 
4
0
 
(请您对文章做出评价)
 
« 上一篇:(大功告成)自动化Dal数据访问层(反射,自动化)

posted on 2013-11-23 12:19 浩浩浩浩浩浩 阅读(986) 评论(8编辑 收藏

 

评论

#1楼   回复引用

推荐 @滴答的雨(何雨泉)的一篇博文:如何在高并发分布式系统中生成全局唯一Id
2013-11-23 12:40 | dudu  

#2楼[楼主]   回复引用

@dudu
谢谢站长看了。
不过他的ID生成方式我不太喜欢,我必须要用步长1增长的。
原因是一般情况下我都是拿id做聚集索引,方便查找。没规律的生成方式的话,就不能固定到哪个列可以做这个目录索引。我在写通用的底层,搭好了就不需要重复写的
2013-11-23 13:48 | 浩浩浩浩浩浩  

#3楼   回复引用

可以参考twitter的 snowflake 生成64位时间有序的全局唯一id
2013-11-23 14:31 | Gavin.Hao  

#4楼   回复引用

聚集索引对于单行的查询的作用要比没有聚集索引来的要更有意义吧。
而且和具体场景也有很大的关系,插入>查询的情况下聚集索引是不是就没太大意义了。
我以前有个实际场景插入>查询允许冗余的。干脆就无主键无聚集索引 id是个时间戳
2013-11-23 15:59 | Nature Q  

#5楼   回复引用

自增的id在合并数据库的时候,如果有很多的表的id跟这个自增的id关联,真的是噩梦啊
2013-11-23 16:10 | chenping2008  

#6楼   回复引用

对于1W 这个量,保要生成序号的时候只要只证生成过程全内存数据操作,即使lock每秒就足应付这个量的生成.如果担心内存操作序列容易意外导致序列掉失就把序列信息通过memorymapping镜向的硬盘就行了.
2013-11-23 18:03 | smark  

#7楼   回复引用

一般情况下我都是拿id做聚集索引,方便查找?

好吧,的确是一般情况下
但是当楼主已经在讨论每秒1万插入的时候,即使已经计算好了id,也会因为这个id导致最终插入速度降低20%左右

无序的聚集索引是插入效率最高的方案。
尤其是在大数据量,多线程的情况下
2013-11-24 02:56 | 徐少侠  

#8楼   回复引用

自增ulong ,只要你不拿来做聊天记录这样的东西,
2^64够你用几辈子了.

 

posted @ 2013-11-25 23:56  小马科技团队博客  阅读(204)  评论(0)    收藏  举报