分布式ID

1.简述

分布式应用业务增长至分表时,主键ID不能够依赖于数据库自增,这个时候需要借助于代码生成;分布式ID生成方法有雪花算法或Java的UUID等等;一般来说分布式ID最好是有序且增长的(像UUID无序会导致数据库的页分裂影响性能);咱们这里提供的分布式ID为32位由5个部分组成(17位时间戳 + 4位IP + 4位业务ID + 6位内存自增 + 1位随机数),这里可能6位内存自增有点难度,将详细描述。

2.分布式ID的5部分简述

  • 17位时间戳
    不做详细描述
  • 4位IP
    取本机内网IP后2段转16进制
  • 4位业务ID
    这里可自定义,比如所有表自己编个号,这里取4位编号即可
  • 6位内存自增
    简单的说就是6位的自增值 ,下一节详细描述
  • 1位随机数
    不做详细描述

3.Java实现6位内存自增

public interface Sequence {
        /**
         * 获取内存自增值
         */
        String getMemoryInc();
    }

    /**
     * 一个序列号生成器的程序同时会有多个线程访问它,要保证每个线程得到的序列号都是自增的,而相互不干扰
     */
    public static class SequenceImpl implements Sequence {

        /**
         * 最大值
         */
        private static final int MAX = 999999;

        public static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);

        @Override
        public String getMemoryInc() {
            Integer cur = threadLocal.get();
            if (cur == MAX) {
                threadLocal.set(0);
            } else {
                threadLocal.set(cur + 1);
            }
            return String.format("%06d", cur);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值