电商网站运营怎么做,小程序开发平台的设计是实现,编程课程收费标准,基于php的网站建设思路方案数据库自增ID机制原理介绍在分布式里面#xff0c;数据库的自增ID机制的主要原理是#xff1a;数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace into跟insert功能类似#xff0c;不…数据库自增ID机制原理介绍在分布式里面数据库的自增ID机制的主要原理是数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace into跟insert功能类似不同点在于replace into首先尝试插入数据列表中如果发现表中已经有此行数据(根据主键或唯一索引判断)则先删除再插入。否则直接插入新数据。单机mysql数据库的自增id实现如下所示 首先表结构如下所示create table t_test(id bigint(20) unsigned not null auto_increment PRIMARY KEY,stub char(1) not null default ,unique key stub (stub))然后我们插入的sql语句和查询的语句如下所示replace into t_test (stub) values(b);select last_insert_id();此时可以看到看到我们刚刚插入的id值是1以上就是单机版mysql的自增id的实现过程但是这里讲的是分布式id所以我们要分析一下数据库的自增ID机制在分布式里面是怎么实现的。分布式id在数据库里面的实现过程既然是分布式id那么最少要使用两个数据库这里我们使用3台来讲解为了保证每一台数据库里面的id自增的时候不会重复那么我们就要给每一台数据库设置auto-increment-increment和auto-increment-offset这两个属性值(auto-increment-increment表示每一台数据库的起始id值然后auto-increment-offset表示每一台数据库每一次的增加数字)设置值如下所示Server1auto-increment-increment 1auto-increment-offset 3Server2auto-increment-increment 2auto-increment-offset 3Server2auto-increment-increment 3auto-increment-offset 3那么如果我们有n台数据库的话那么上面的auto-increment-increment和auto-increment-offset这两个属性值应该怎么设计呢我们给每一台数据库设置初始值分别为1,2,3...N然后每一台数据库自增步长为机器的台数N如下图所示数据库自增ID是否适合做分布式ID那数据库自增ID机制适合作分布式ID吗答案是不太适合为什么呢我总结了下面两个原因1系统水平扩展比较困难比如定义好了步长和机器台数之后如果要添加机器该怎么做假设现在只有一台机器发号是1,2,3,4,5(步长是1)这个时候需要扩容机器一台。可以这样做把第二台机器的初始值设置得比第一台超过很多比如14(主要这里设置14的前提是在扩容期间第一台机器的ID不可能增加到14)同时设置步长为2那么这台机器下发的号码都是14以后的偶数。然后摘掉第一台把ID值保留为奇数比如7然后修改第一台的步长为2。让它符合我们定义的号段标准。扩容方案看起来复杂吗貌似还好现在想象一下如果我们线上有100台机器这个时候要扩容该怎么做简直是噩梦。所以系统水平扩展方案复杂难以实现。2数据库压力还是很大每次获取ID都得读写一次数据库非常影响性能不符合分布式ID里面的延迟低和要高QPS的规则(在高并发下如果都去数据库里面获取id那是非常影响性能的)看到这里的同学觉得好的话就帮忙推荐下吧Thanks♪(ω)