您当前的位置: 首页 >  分布式

java持续实践

暂无认证

  • 3浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

黑马十次方项目day01-10之分布式的id生成器

java持续实践 发布时间:2019-01-06 14:23:52 ,浏览量:3

文章目录
      • 为什么要用分布式的id生成器
      • 写IdWorker分布式id生成器的类

为什么要用分布式的id生成器

因为微服务的项目中,每个项目都是一个容器,每个容器都可能操作同一张表. 如果采用传统的主键自增的方式生成id, 那么当不同的容器操作同一张表的时候, 就可能产生了主键的冲突. 而采用推特的雪花算法,每秒能产生26万条的id. 保证了整个分布式系统中,不会产生相同的id

写IdWorker分布式id生成器的类

在tensquare_common工程,创建util包 IdWorker 类的内容如下

package util;

import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.NetworkInterface;

/**
 * 

名称:IdWorker.java

*

描述:分布式自增长ID

*
 *     Twitter的 Snowflake JAVA实现方案
 * 
* 核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用: * 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000 * 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间, * 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识), * 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。 * 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分), * 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。 *

* 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)) * * @author Polim */ public class IdWorker { // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) private final static long twepoch = 1288834974657L; // 机器标识位数 private final static long workerIdBits = 5L; // 数据中心标识位数 private final static long datacenterIdBits = 5L; // 机器ID最大值 private final static long maxWorkerId = -1L ^ (-1L

关注
打赏
1658054974
查看更多评论
0.1555s