分布式ID设计方案
package com.example.core.mydemo.thread;
import java.util.UUID;
public class IDTest {
public static void main(String[] args) {
String uuid = UUID.randomUUID().toString();
//6c1d27a1-6a1c-458e-bc66-3cfb76999733
//在分布式日志系统或者分布式链路跟踪系统中,可以使用UUID生成唯一标识,用于串联请求的日志。
//缺点:UUID生成的字符串太长,通过索引查询数据的效率比较低。此外,UUID生成的字符串,顺序没有保证,不是递增的,不满足工作中的有些业务场景。
System.out.println("uuid=" + uuid);
/**
* MySQL中的auto_increment。
* Oracle中sequence。
* 在一些老系统或者公司的内部管理系统中,可能会用数据库递增ID作为分布式ID的方案,这些系统的用户并发量一般比较小,数据量也不多。
* 缺点:只能保证单表的数据唯一性,如果跨表或者跨数据库,ID可能会重复。ID是自增的,生成规则很容易被猜透,有安全风险。ID是基于数据库生成的,在高并发下,可能会有性能问题。
*/
/**
* 数据库号段模式
* 一次生成一定步长的ID,比如:步长是1000,每次数据库自增1000,ID值从100001变成了101001
* 这时需要重新从数据库中获取一次新号段的ID,缓存到服务器的内存中,这样下次又能直接从内存中获取ID了。
* 缺点:ID是自增的,生成规则很容易被猜透,有安全风险。如果数据库是单节点的,有岩机的风险。
*/
/**
* 数据库的多主模式
* 为了保证在不同的master实例下ID的唯一性,我们需要事先规定好每个master下的大的区间,比如:master1的数据是10开头的,master2的数据是11开头的,master3的数据是12开头的。
* 缺点:跨多个master实例下生成的ID,可能不是递增的。
*/
/**
* Redis生成ID
* SET ID_VALUE 1000
* INCR ID_VALUE
* GET ID_VALUE
* DEL ID_VALUE 删除
* 缺点:ID是自增的,生成规则很容易被猜透,有安全风险。并且Redis可能也存在单节点,岩机的风险。
*/
/**
* Zookeeper生成ID
* Zookeeper主要通过其znode数据版本来生成序列号,可以生成32位和64位的数据版本号,客户端可以使用这个版本号来作为唯一的序列号。
*/
/**
* Snowflake(雪花算法)是Twitter开源的分布式ID算法。
* 缺点:依赖服务器时间,服务器时钟回拨时可能会生成重复ID。
*/
/**
* Leaf是美团开源的分布式ID生成系统,它提供了两种生成ID的方式:
* Leaf-segment号段模式
* Leaf-snowflake雪花算法
* https://github.com/Meituan-Dianping/Leaf
*/
/**
* Tinyid是滴滴用Java开发的一款分布式id生成系统,基于数据库号段算法实现。
* https://github.com/didi/tinyid
*/
/**
* 百度 UID-Generator 使用 Java 语言,基于雪花算法实现。
*/
}
}