国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

分布式ID生成的常見方案~都在這里啦!

云計算 分布式
我們日常開發中,經常需要使用到分布式ID。我們系統一般都是分布式部署的,一些分布式鎖、冪等、數據庫的唯一鍵,都需要分布式ID。

前言

大家好,我是田螺。

我們日常開發中,經常需要使用到分布式ID。我們系統一般都是分布式部署的,一些分布式鎖、冪等、數據庫的唯一鍵,都需要分布式ID。

今天田螺哥盤點一些常見的分布式唯一ID生成方案。

1. 數據庫自增ID

原理:利用數據庫自增字段(如MySQL的AUTO_INCREMENT)生成唯一ID

圖片圖片

優點:簡單易用、ID有序、索引效率高缺點:單點故障、擴展性差(分庫分表困難)
適用場景:單機或簡單主從架構系統

代碼示例

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_data VARCHAR(255)
);

2. UUID

  • 原理:基于MAC地址、時間戳、隨機數生成128位字符串
  • 優點:全局唯一、無需中心化服務
  • 缺點:無序導致索引效率低、存儲空間大(36字符)
  • 適用場景:日志跟蹤、非核心業務(如臨時會話)

我們的項目中,有些伙伴為了簡單方便,有時候會直接用它,如果業務性比較強的,就在它后綴拼接寫個性化標記(業務標記)進來~

代碼示例

import java.util.UUID;
String uuid = UUID.randomUUID().toString();

3. 雪花算法(Snowflake)

  • 原理:64位結構 = 時間戳(41位) + 機器ID(10位) + 序列號(12位)

    圖片圖片

  • 優點:高性能(單機每秒4萬+)、趨勢遞增29
  • 缺點:依賴時鐘同步(時鐘回撥會導致重復)
  • 適用場景:分布式高并發系統(如電商訂單)

其實,我們現在的系統,很多場景就是用雪花算法生成的,如流水號等等~

代碼示例

public class Snowflake {
    private long machineId;
    private long sequence = 0L;
    private long lastTimestamp = -1L;

    public synchronized long nextId() {
        long timestamp = System.currentTimeMillis();
        if (timestamp < lastTimestamp) {
            throw new RuntimeException("時鐘回撥!");
        }
        if (timestamp == lastTimestamp) {
            sequence = (sequence + 1) & 4095; // 12位序列號
            if (sequence == 0) timestamp = tilNextMillis(lastTimestamp);
        } else {
            sequence = 0L;
        }
        lastTimestamp = timestamp;
        return (timestamp << 22) | (machineId << 12) | sequence;
    }
}

4. 數據庫號段模式

  • 原理:批量獲取ID段(如一次取1000個),減少數據庫訪問
  • 優點:降低數據庫壓力、可用性高(緩存號段)、速度快
  • 缺點:在服務器重啟或故障轉移等情況下,可能會導致ID的生成出現不連續的情況。
  • 適用場景:中等并發業務(如用戶ID生成)

我們的一些客戶號,當前是用號段模式生成的,然后拼一些業務標記

表結構:

CREATE TABLE id_segment (
    biz_tag VARCHAR(50) PRIMARY KEY,
    max_id BIGINT NOT NULL,
    step INT NOT NULL,
    version INT NOT NULL
);

5. Redis分布式ID

  • 原理:利用INCR原子操作生成遞增ID

    圖片圖片

  • 優點:性能優于數據庫、天然有序、高性能、可擴展性強
  • 缺點:依賴Redis可用性
  • 適用場景:按日生成的流水號(如訂單號=日期+自增)

代碼示例:

Jedis jedis = new Jedis("redis-host");
Long orderId = jedis.incr("order:20240526");

6.百度的uid-generator

優點:避免頻繁生成、吞吐量提升至600萬/秒
適用場景:超大規模分布式系統

基于Twitter的Snowflake算法進行改進,增加了更多的配置和靈活性。

與原始的snowflake算法不同在于,uid-generator支持自定義時間戳、工作機器ID和 序列號 等各部分的位數,而且uid-generator中采用用戶自定義workId的生成策略。

代碼示例:

import com.baidu.fsg.uid.UidGenerator;  
import com.baidu.fsg.uid.impl.CachedUidGenerator;  
  
public class UidGeneratorDemo {  
  
    public static void main(String[] args) {  
        // 創建一個UidGenerator實例  
        UidGenerator uidGenerator = new CachedUidGenerator();  
  
        // 初始化,這里只是一個簡單的示例,實際使用時你可能需要根據你的業務場景進行更復雜的配置  
        // 例如,設置workerId、epoch等  
        // 注意:在多實例部署時,每個實例的workerId必須唯一  
        long workerId = 1L; // 示例ID,實際使用時需要保證每個實例的唯一性  
        long datacenterId = 1L; // 數據中心ID,示例  
        uidGenerator.init(workerId, datacenterId, null);  
  
        // 生成一個UID  
        long uid = uidGenerator.getUID();  
        System.out.println("Generated UID: " + uid);  
    }  
}


7. 基于Zookeeper的順序節點

利用Zookeeper的順序節點特性來生成全局唯一ID。

圖片圖片

優點:

  • 利用Zookeeper的集群特性保證高可用。
  • ID全局唯一。

缺點:

  • 需要依賴Zookeeper集群。
  • 可能會受到Zookeeper性能的限制。
  • 并發競爭較大不適合用Zookeeper

8. 數據庫集群模式

單庫的數據庫自增ID會存在單點問題,所以可以用數據庫集群模式,去解決這個問題。數據庫集群模式:通過多個數據庫實例設置不同的起始值和步長來生成全局唯一的ID。

圖片圖片


數據庫集群模式優點

  • 可以有效生成集群中的唯一ID。解決了單點的問題。
  • 降低ID生成數據庫操作的負載。

數據庫集群模式缺點

  • 需要獨立部署多個數據庫實例,成本高。
  • 后期不方便擴展

9. 美團(Leaf)

Leaf是美團點評開源的分布式ID生成系統,包含基于數據庫和基于Zookeeper的兩種實現方式。

以基于數據庫的自增ID生成策略為例(數據庫表結構):

CREATE TABLE leaf_alloc (  
    biz_tag VARCHAR(128) NOT NULL COMMENT '業務key',  
    max_id BIGINT(20) NOT NULL COMMENT '當前已分配的最大id',  
    step INT(11) NOT NULL COMMENT '每次id的增長步長',  
    PRIMARY KEY (biz_tag)  
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

Java 實現:

import java.sql.*;  
  
public class LeafIdGenerator {  
  
    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimeznotallow=UTC";  
    private static final String USERNAME = "your_username";  
    private static final String PASSWORD = "your_password";  
  
    private static final String UPDATE_SQL = "UPDATE leaf_alloc SET max_id = max_id + ? WHERE biz_tag = ?";  
    private static final String SELECT_SQL = "SELECT max_id FROM leaf_alloc WHERE biz_tag = ? FOR UPDATE";  
  
    public synchronized long getId(String bizTag) throws SQLException {  
        Connection conn = null;  
        PreparedStatement updateStmt = null;  
        PreparedStatement selectStmt = null;  
        ResultSet rs = null;  
  
        try {  
            conn = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);  
            selectStmt = conn.prepareStatement(SELECT_SQL);  
            selectStmt.setString(1, bizTag);  
            rs = selectStmt.executeQuery();  
  
            if (rs.next()) {  
                long maxId = rs.getLong("max_id");  
                int step = 1000; // 假設步長為1000,你可以從數據庫中讀取這個值  
  
                // 假設這里只是簡單演示,不檢查是否超過max_id + step是否溢出  
                updateStmt = conn.prepareStatement(UPDATE_SQL);  
                updateStmt.setInt(1, step);  
                updateStmt.setString(2, bizTag);  
                updateStmt.executeUpdate();  
  
                // 返回ID區間中的一個ID,這里簡單返回maxId(實際應用中可能需要更復雜的策略)  
                return maxId;  
            } else {  
                // 如果沒有找到對應的bizTag,則需要初始化  
                // ... 初始化代碼省略 ...  
                throw new RuntimeException("BizTag not found: " + bizTag);  
            }  
        } finally {  
            // 關閉資源,省略了異常處理  
            if (rs != null) rs.close();  
            if (selectStmt != null) selectStmt.close();  
            if (updateStmt != null) updateStmt.close();  
            if (conn != null) conn.close();  
        }  
    }  
  
    public static void main(String[] args) {  
        LeafIdGenerator generator = new LeafIdGenerator();  
        try {  
            long id = generator.getId("test-biz-tag");  
            System.out.println("Generated ID: " + id);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
}

優點

  • 結合了數據庫和Zookeeper的優點,提供了高可用和高性能的ID生成服務。缺點:
  • 就是時鐘回撥問題、復雜性高。

10. 滴滴(Tinyid)

Tinyid是滴滴開源的輕量級分布式ID生成系統,它是基于號段模式原理實現的與Leaf如出一轍,每個服務獲取一個號段(1000,2000]、(2000,3000]、(3000,4000]

圖片圖片

以下是一個簡化的Tinyid,服務端的偽代碼:

// 假設我們有一個ID生成器,這里用AtomicLong模擬  
import java.util.concurrent.atomic.AtomicLong;  
  
public class TinyidService {  
    private AtomicLong idGenerator = new AtomicLong(0);  
  
    // 模擬的ID生成方法  
    public synchronized long generateId() {  
        return idGenerator.incrementAndGet();  
    }  
  
    // 這里應該是RESTful API的實現,但為簡化起見,我們省略了HTTP部分  
    // 客戶端應該通過HTTP請求調用此方法  
    public long getIdOverHttp() {  
        return generateId();  
    }  
}

客戶端(Java示例)

import okhttp3.*;  
  
public class TinyidClient {  
    private static final String TINYID_SERVICE_URL = "http://localhost:8080/tinyid/generate";  
  
    public static void main(String[] args) {  
        OkHttpClient client = new OkHttpClient();  
  
        Request request = new Request.Builder()  
                .url(TINYID_SERVICE_URL)  
                .build();  
  
        client.newCall(request).enqueue(new Callback() {  
            @Override  
            public void onFailure(Call call, IOException e) {  
                e.printStackTrace();  
            }  
  
            @Override  
            public void onResponse(Call call, Response response) throws IOException {  
                if (!response.isSuccessful()) {  
                    throw new IOException("Unexpected code " + response);  
                } else {  
                    // 假設服務端返回的是純文本格式的ID  
                    String responseBody = response.body().string();  
                    long id = Long.parseLong(responseBody);  
                    System.out.println("Generated ID: " + id);  
                }  
            }  
        });  
    }  
}
  • 優缺點:簡單、輕量級,但性能可能不如其他方案。
責任編輯:武曉燕 來源: 撿田螺的小男孩
相關推薦

2019-04-24 08:31:43

分布式限流kafka

2025-05-16 09:34:10

2024-07-02 11:16:21

2019-06-18 09:10:01

工具策略系統

2019-11-14 08:44:11

分布式系統策略

2017-10-24 14:57:58

AI人工智能機器學習

2018-04-26 16:15:02

數據庫MySQLMySQL 8.0

2018-03-19 14:43:28

2021-07-01 09:00:00

安全數字化轉型滲透

2021-12-09 08:16:40

JVM參數系統

2019-11-04 09:07:48

DevOps互聯網IT

2023-09-11 08:51:23

LinkedList雙向鏈表線程

2021-06-17 13:40:47

區塊鏈比特幣公有鏈

2021-10-06 16:21:32

類型對象Typescript

2023-12-11 21:59:01

時序分析深度學習自回歸模型

2022-06-16 07:31:15

MySQL服務器服務

2017-12-23 14:55:14

Java語言編程

2020-03-18 18:20:19

區塊鏈數字貨幣比特幣

2019-12-04 07:57:22

6G5G網絡

2009-06-24 14:10:22

點贊
收藏

51CTO技術棧公眾號

日韩高清一区| 五月激情在线| 日韩大胆成人| 亚洲一区二区av| 亚洲一区二区小说| 国产乱码精品一区二区亚洲| 欧美日韩一区免费| av在线播放国产| www..com日韩| 香蕉综合视频| 日本乱码高清不卡字幕| 日韩精品三级| 亚洲的天堂在线中文字幕| 久久经典视频| 国产精品亚洲一区二区三区妖精| 欧美亚洲动漫精品| 国产欧美日韩在线| 菠萝蜜影院一区二区免费| 国产精品99999| 狠狠色综合播放一区二区| 国产男人精品视频| 亚洲高清在线一区| 亚洲人成电影网站色…| 黄色免费在线看| 日韩欧美精品网站| 天天干夜夜干| 亚洲精品国产精华液| 欧美激情 国产精品| 日韩午夜av| 欧美日韩电影在线播放| 高清中文字幕在线| 99re成人精品视频| 91午夜在线观看| 国产一区二区看久久| 午夜精品亚洲一区二区三区嫩草 | 中文字幕免费不卡| 一区二区三区四区欧美日韩| 麻豆网站在线看| 久久亚洲道色| 最新的欧美黄色| 日本伦理一区二区| 欧美精品vⅰdeose4hd| 麻豆app在线观看| 精品国产鲁一鲁一区二区张丽| 国产在线黄色片| 亚洲一区二区在线免费观看视频| jizz在亚洲| 亚洲主播在线观看| 热国产热中文视频二区| 亚洲国产美女搞黄色| 黄动漫视频高清在线| 亚洲国产美女搞黄色| 色网在线视频| 欧美日韩一二三区| 国产激情视频在线看| 一个色综合导航| 91久久精品无嫩草影院| 欧美一二三视频| 五月开心六月丁香综合色啪| 国产欧美日韩一区| 久久99久久久欧美国产| 欧美日韩黄色一级片| 国产精品久久久久婷婷 | 久9re热视频这里只有精品| 欧美多人爱爱视频网站| 亚洲影院天堂中文av色| 91夜夜揉人人捏人人添红杏| 日韩午夜一区| 正在播放国产精品| 99久久综合狠狠综合久久| 亚洲无吗一区二区三区| 亚洲成人午夜电影| 国产一二区在线| 亚洲性日韩精品一区二区| 欧美特黄不卡| 国产欧美精品日韩| 天堂一区二区在线| 阿v天堂2018| 亚洲乱码国产乱码精品精可以看 | 亚州黄色一级| 欧美亚洲国产bt| h片精品在线观看| 欧美另类高清videos| 91亚洲国产| 亚洲高清视频在线观看| 久久一区二区视频| 亚洲精品无码专区在线播放| 精品久久免费看| 成人直播在线观看| 国产精品初高中精品久久 | 欧美一级高清免费播放| 黄色精品一区| 欧美不卡福利| 国产女人18毛片水真多成人如厕| 一级在线免费观看| 亚洲乱亚洲乱妇无码| 美女av一区| 欧美日韩大片一区二区三区| 91美女蜜桃在线| seseavlu视频在线| 欧美巨猛xxxx猛交黑人97人| 一区在线播放| 中文字幕永久视频| 日韩午夜精品视频| 免费成人av| 激情六月天婷婷| 欧美性生交xxxxxdddd| 成人激情久久| 欧洲视频一区二区三区| 日韩理论片网站| 亚洲黄色网址| 亚洲伊人久久综合| 国产亚洲欧美一区在线观看| 日本小视频在线免费观看| 日韩免费av片在线观看| 国产·精品毛片| 黄色av网站在线播放| 国产成人精品一区二区在线| 国产成人高清在线| 美女写真理伦片在线看| 日本不卡免费高清视频| 国产91高潮流白浆在线麻豆| melody高清在线观看| 18性欧美xxxⅹ性满足| 国产精品1区2区| 人人九九精品| 久久久久久久久久久免费 | 黄色一级片av| 色综合久久综合中文综合网| 天堂精品久久久久| 亚洲欧洲精品一区| 91成人在线免费观看| 蜜桃一区二区三区| 国产v亚洲v天堂无码久久久| 日韩精品免费观看| 午夜一区在线| 成人综合影院| 国产精品久久久久久久久久东京 | 91亚洲精品丁香在线观看| 国产精品美女一区二区| 成人黄色毛片| 永久免费看av| 亚洲精品影视在线观看| 日韩av电影一区| 国产在线高清视频| 国产超碰91| 欧美色视频日本高清在线观看| 亚洲欧美日本伦理| 日日碰狠狠躁久久躁婷婷| 一区二区福利视频| 国产精品99久久久久久有的能看 | 国产一区二区精品免费| 欧美性20hd另类| 久久亚洲精品中文字幕蜜潮电影| 啊啊啊啊啊啊啊视频在线播放| 欧美激情高清视频| 国产精品天干天干在观线| 给我免费播放日韩视频| 九九九在线观看视频| 美女性感视频久久久| 久久嫩草精品久久久精品| 在线欧美激情| 天天干在线影院| 久久久噜噜噜久久中文字免| 久久久久久亚洲综合| vam成人资源在线观看| 欧美在线观看视频网站| 欧美第一页在线| 一色桃子久久精品亚洲| 亚洲裸色大胆大尺寸艺术写真| 成视频免费在线看| 国产一区视频在线播放| 欧美影院一区二区| 日本人妖一区二区| 欧美7777| 国产一区二区在线免费播放| 91精品国产91久久久久| 一区二区三区四区av| 欧美在线1区| av在线免费网站| 18禁裸男晨勃露j毛免费观看| 久久国产精品免费视频| 亚洲精品乱码久久久久久久久 | 在线观看福利一区| 国产亚洲欧洲在线| 国产精品毛片无遮挡高清| 久久国产成人精品| 老司机精品视频在线观看6| 中文字幕欧美日韩一区二区| 美日韩精品视频免费看| 香蕉加勒比综合久久| 视频在线在亚洲| 日本黄色成人| 中文字幕在线中文字幕二区| 欧美精品一区二区三区在线看午夜| 亚洲精品ady| 国产精品福利av| 亚洲少妇诱惑| 日韩三级一区| 一级毛片在线看|