改写默认sharding-jdbc 3.0.0 的雪花算法

2019-03-06  本文已影响0人  simians

sharding-jdbc 最新官网
sharding-jdbc 3.0.0雪花算法存在一个问题,就是在并发量不高的情况下生成的id有大部分为偶数,这就造成了一个问题,基数表几乎不会写进去数据,偶数表压力会很大。
更新:sharding-jdbc 3.1.0 更新后该问题解决
解决方法就是去掉一个判断(但是不了解会不会影响其性能)
参考csdn作者: wzz_java

改写前

    public synchronized Number generateKey() {
        long currentMillis = timeService.getCurrentMillis();
        Preconditions.checkState(this.lastTime <= currentMillis, "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", new Object[]{this.lastTime, currentMillis});
        if (this.lastTime == currentMillis) {//将他去掉
            if (0L == (this.sequence = this.sequence + 1L & 4095L)) {
                currentMillis = this.waitUntilNextTime(currentMillis);
            }
        } else {//将他去掉
            this.sequence = 0L;
        }

        this.lastTime = currentMillis;
        return currentMillis - EPOCH << 22 | workerId << 12 | this.sequence;
    }

改写后
由于默认的类是 fianl 的 所以可以直接创建一个新类来进行改写(本来打算重写 该方法来着。。。)

    public synchronized long getGeneratorKey(){
        //获取系统当前时间戳
       long currentMillis = System.currentTimeMillis();
       //检查时间 如果时间小于 最新时间则抛出传参异常
        Preconditions.checkState(this.lastTime <= currentMillis, "Clock is moving backwards, last time is %d milliseconds, current time is %d milliseconds", new Object[]{this.lastTime, currentMillis});
            if (0L == (this.sequence = this.sequence + 1L & SEQUENCE_MASK)) {
                currentMillis = this.waitUntilNextTime(currentMillis);
            }
        this.lastTime = currentMillis;
            //当前时间-起始时间 左移22位 wokerId 左移10位 后 三者做或运算 00为0 01为1 11位1 10未1
        return currentMillis - EPOCH << TIMESTAMP_LEFT_SHIFT_BITS | workerId << WORKER_ID_LEFT_SHIFT_BITS | this.sequence;
    }
上一篇下一篇

猜你喜欢

热点阅读