博友们一起来讨论下高并发非自增ID如何设计?
博友们一起来讨论下高并发非自增ID如何设计?
底层是很重要的,我最近设计底层,通用底层。
我想跟大家谈论下这个话题:
如何在高并发环境下设计出一套好用的非自增ID的添加操作的解决方案?更新的操作我随机生成一个时间因子,新增的解决方案就希望大家可以一起讨论下。
打个比方,一个表,一万条新增请求同时涌进来,表为空,也就是一万条同时获取到要赋值的id就是1,更新了第一条,剩下的怎么处理?在第二条处理过程中,又有一万条新增记录涌进来,又如何处理?如何保证性能,ID不重复,友好性?ID列设计为聚集索引主键,数据库不需怎么考虑,要考虑的是程序方面。
(Disruptor并发编程框架,大家可以百度下Disruptor)前几天看了博友的一些并发有关的文章,正好自己也在为这些事情在思考着。
发散下大家的思维,集思广益。下图为我目前想到的解决方案,有漏洞和不完善的请提出,最好有优化方案,或者听听大家的解决方案。放弃自增列是因为很多情况下是多个表的外键,而且自增列很不方便

1.减少IO操作
2.避免使用锁,防止死锁和性能不高(需要排队)
3.充分发挥多线程的作用,无需返回结果或操作结果不需考虑的操作,都另外开一个线程处理,从而外部大进程无需等待
4.数据库知识,前端知识熟悉,一件事程序处理是效果不好的,就交由数据库或浏览器处理
作者:小浩
出处:http://www.cnblogs.com/pinhao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/pinhao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
评论
#2楼[楼主] 回复引用
@dudu
谢谢站长看了。
不过他的ID生成方式我不太喜欢,我必须要用步长1增长的。
原因是一般情况下我都是拿id做聚集索引,方便查找。没规律的生成方式的话,就不能固定到哪个列可以做这个目录索引。我在写通用的底层,搭好了就不需要重复写的
谢谢站长看了。
不过他的ID生成方式我不太喜欢,我必须要用步长1增长的。
原因是一般情况下我都是拿id做聚集索引,方便查找。没规律的生成方式的话,就不能固定到哪个列可以做这个目录索引。我在写通用的底层,搭好了就不需要重复写的
#4楼 回复引用
聚集索引对于单行的查询的作用要比没有聚集索引来的要更有意义吧。
而且和具体场景也有很大的关系,插入>查询的情况下聚集索引是不是就没太大意义了。
我以前有个实际场景插入>查询允许冗余的。干脆就无主键无聚集索引 id是个时间戳
而且和具体场景也有很大的关系,插入>查询的情况下聚集索引是不是就没太大意义了。
我以前有个实际场景插入>查询允许冗余的。干脆就无主键无聚集索引 id是个时间戳
#6楼 回复引用
对于1W 这个量,保要生成序号的时候只要只证生成过程全内存数据操作,即使lock每秒就足应付这个量的生成.如果担心内存操作序列容易意外导致序列掉失就把序列信息通过memorymapping镜向的硬盘就行了.


浙公网安备 33010602011771号