赞
踩
在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。
如在美团点评的金融、支付、餐饮、酒店;猫眼电影等产品的系统中数据日渐增长,对数据分库分表后需要有一个唯一Id来标识一条数据或消息;特别一点的如订单、骑手、优惠券也都需要有唯一Id坐标时。
此时一个能够生成全局唯一Id的系统是非常必要的。
为什么无序的UUID会导致入库性能变差呢?
REPLACE INTO 的含义是插入一条记录,如果表中唯一索引的值遇到冲突,则替换老数据
那数据库自增ID机制适合做分布式ID吗?答案是不太合适
因为Redis是单线的天生保证原子性,可以使用原子操作INCR和INCRBY来实现。
注意: 在Redis集群情况下,同样和Mysql一样需要设置不同的增长步长,同时key一定要设置有效期。
可以使用Redis集群来获取更高的吞吐量。
综上分析:那么问题就来了,自增id会担心主键重复,UUID不能保证有序性,有没有一种ID既是有序的,又是唯一的呢?当然有,就是雪花ID。
最初Twitter把存储系统从Mysql迁移到Cassandra(由Facebook开发一套开源分布式NoSQL数据库系统)因为Cassandra没有顺序ID生成机制,所以开发了一套全局唯一ID生成服务。
Twitter的分布式雪花算法SnowFlake,经测试每秒能够产生26万个自增可排序ID。
twitter的SnowFlake生成ID能够按照时间有序生成;
SnowFlake算法生成id的结果是一个64bit大小的整数,为一个Long型(转换成字符串后长度为19);
分布式系统内不会产生ID碰撞(由datacenter和workerId作区分)并且效率较高。
号段解析
SnowFlake可以保证: 所有生成的id按时间趋势递增,整个分布式系统内不会产生重复id。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。