类比身份证,引出分布式ID:
AtomicInteger / AtomicLong 线程对外看是唯一的
资源征用的场景如何保证唯一:锁 乐观锁 / 悲观锁
解决目标
缓存+锁细粒度化+无锁,保证全局唯一即可
下面方法基本都是互相借鉴的基于UUID生成唯一ID 逻辑主键、物理主键:id是int自增主键,uuid是普通的varchar列 名字空间:国家-地区 不能使用IP代替MAC(局域网可以,广域网不行:NAT) 可以使用NAT转换IP地址UUID生成策略 UID是用户ID,GID是用户组 / 线程组ID 随机数算法:数论当中的线性同余,保证每个值的概率分布接近同一个值,不是真正的随机数 Java的UUID生成策略,用的是下图中的 version 4
id是int自增主键,uuid是普通的varchar列
NAT 网络地址转换
NAT名字很准确,网络地址转换,就是替换IP报文头部的地址信息。NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力。 必须先建立路由表,然后进行转发 用来进行IP地址不够用的问题
现在没人用了,Redis都比这个方法好 每台机器设置不同的初始值,且步长和机器数相等。 此方法想想都觉得难受…而且拓展性不好 两台机器同时申请号段的时候,怎么保证号段唯一?用乐观锁 用redis实现分布式id,性能比用db的方案好很多 可以和上面号段的方法结合使用 存在异步复制的问题,如果业务不能够容忍,去修改redis源码,改成同步复制,但是性能会下降