安然写字的地方

hilo算法

介绍

hilo算法是一个主键生成策略。 在算法中id的计算公式是:

hi * (max_lo + 1) + lo

代码如下:


private class HiloOptimizer {

    private String prefix;
    private int maxLo;
    private int lo;
    private long hi;
    private long lastValue;

    public HiloOptimizer(String prefix, int maxLo) {
        this.prefix = prefix != null ? prefix.replace("{", "${") : "";
        this.maxLo = maxLo;            //最大低位  
        this.lo = maxLo + 1;           //最低初始位  
    }

    public synchronized String generate() {
        if (lo > maxLo) {                    //当低位超过最大高位  
            lastValue = getLastValue();  //表示hi位的进位次数,从数据库id管理表获取  
            lo = lastValue == 0 ? 1 : 0;     //低位归0  
            hi = lastValue * (maxLo + 1);    //高位进位  
        }
        return String.valueOf(hi + lo++);    //低位最后自增lo++  
    }
} 

分析

hilo算法的优势: 解决了一个效率问题: 每次取id号都要从数据库查一遍。 分析了hilo算法,它其实优化了类似oracle序列这种由数据库管理的id,每次插入都必须查询一遍数据库这种模式,用一个静态变量低位当成一个oracle序列,当它增长超过设置的最大低位时再查询数据库,减少查询数据库的次数maxLo倍!从而提升了项目的效率和性能。

自增表数据删除

业务时常会依赖表主键自增id来生成订单号,但我们一般只需第一条,历史数据都是可删除的。 通过重命名表可达到这个效果:

RENAME TABLE `tt` TO `tt_old`, `tt_new` TO `tt`;