分布式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 语言,基于雪花算法实现。 */ } }
标签:Leaf,UUID,数据库,生成,设计方案,ID,分布式 From: https://www.cnblogs.com/oktokeep/p/18573233