国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Rumah php教程 php手冊(cè) 分布式系統(tǒng)唯一ID生成方案匯總

分布式系統(tǒng)唯一ID生成方案匯總

Sep 14, 2018 pm 01:39 PM
diedarkan

系統(tǒng)唯一ID是我們?cè)谠O(shè)計(jì)一個(gè)系統(tǒng)的時(shí)候常常會(huì)遇見的問題,也常常為這個(gè)問題而糾結(jié)。生成ID的方法有很多,適應(yīng)不同的場(chǎng)景、需求以及性能要求。所以有些比較復(fù)雜的系統(tǒng)會(huì)有多個(gè)ID生成的策略。下面就介紹一些常見的ID生成策略。

一、數(shù)據(jù)庫(kù)自增長(zhǎng)序列或字段?

最常見的方式。利用數(shù)據(jù)庫(kù),全數(shù)據(jù)庫(kù)唯一。

優(yōu)點(diǎn):

  1. 簡(jiǎn)單,代碼方便,性能可以接受。

  2. 數(shù)字ID天然排序,對(duì)分頁(yè)或者需要排序的結(jié)果很有幫助。

缺點(diǎn):

  1. 不同數(shù)據(jù)庫(kù)語(yǔ)法和實(shí)現(xiàn)不同,數(shù)據(jù)庫(kù)遷移的時(shí)候或多數(shù)據(jù)庫(kù)版本支持的時(shí)候需要處理。

  2. 在單個(gè)數(shù)據(jù)庫(kù)或讀寫分離或一主多從的情況下,只有一個(gè)主庫(kù)可以生成。有單點(diǎn)故障的風(fēng)險(xiǎn)。

  3. 在性能達(dá)不到要求的情況下,比較難于擴(kuò)展。

  4. 如果遇見多個(gè)系統(tǒng)需要合并或者涉及到數(shù)據(jù)遷移會(huì)相當(dāng)痛苦。

  5. 分表分庫(kù)的時(shí)候會(huì)有麻煩。

優(yōu)化方案:

  1. 針對(duì)主庫(kù)單點(diǎn),如果有多個(gè)Master庫(kù),則每個(gè)Master庫(kù)設(shè)置的起始數(shù)字不一樣,步長(zhǎng)一樣,可以是Master的個(gè)數(shù)。比如:Master1 生成的是 1,4,7,10,Master2生成的是2,5,8,11 Master3生成的是 3,6,9,12。這樣就可以有效生成集群中的唯一ID,也可以大大降低ID生成數(shù)據(jù)庫(kù)操作的負(fù)載。

?

二、UUID 常見的方式。

可以利用數(shù)據(jù)庫(kù)也可以利用程序生成,一般來說全球唯一。

優(yōu)點(diǎn):

  1. 簡(jiǎn)單,代碼方便。

  2. 生成ID性能非常好,基本不會(huì)有性能問題。

  3. 全球唯一,在遇見數(shù)據(jù)遷移,系統(tǒng)數(shù)據(jù)合并,或者數(shù)據(jù)庫(kù)變更等情況下,可以從容應(yīng)對(duì)。

缺點(diǎn):

  1. 沒有排序,無法保證趨勢(shì)遞增。

  2. UUID往往是使用字符串存儲(chǔ),查詢的效率比較低。

  3. 存儲(chǔ)空間比較大,如果是海量數(shù)據(jù)庫(kù),就需要考慮存儲(chǔ)量的問題。

  4. 傳輸數(shù)據(jù)量大

  5. 不可讀。

?

三、Redis生成ID?

當(dāng)使用數(shù)據(jù)庫(kù)來生成ID性能不夠要求的時(shí)候,我們可以嘗試使用Redis來生成ID。這主要依賴于Redis是單線程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY來實(shí)現(xiàn)。

可以使用Redis集群來獲取更高的吞吐量。假如一個(gè)集群中有5臺(tái)Redis。可以初始化每臺(tái)Redis的值分別是1,2,3,4,5,然后步長(zhǎng)都是5。各個(gè)Redis生成的ID為:

A:1,6,11,16,21 B:2,7,12,17,22 C:3,8,13,18,23 D:4,9,14,19,24 E:5,10,15,20,25

這個(gè),隨便負(fù)載到哪個(gè)機(jī)確定好,未來很難做修改。但是3-5臺(tái)服務(wù)器基本能夠滿足器上,都可以獲得不同的ID。但是步長(zhǎng)和初始值一定需要事先需要了。使用Redis集群也可以方式單點(diǎn)故障的問題。

另外,比較適合使用Redis來生成每天從0開始的流水號(hào)。比如訂單號(hào)=日期+當(dāng)日自增長(zhǎng)號(hào)??梢悦刻煸赗edis中生成一個(gè)Key,使用INCR進(jìn)行累加。

優(yōu)點(diǎn):

  1. 不依賴于數(shù)據(jù)庫(kù),靈活方便,且性能優(yōu)于數(shù)據(jù)庫(kù)。

  2. 數(shù)字ID天然排序,對(duì)分頁(yè)或者需要排序的結(jié)果很有幫助。

缺點(diǎn):

  1. 如果系統(tǒng)中沒有Redis,還需要引入新的組件,增加系統(tǒng)復(fù)雜度。

  2. 需要編碼和配置的工作量比較大。

?

四、Twitter的snowflake算法?

snowflake是Twitter開源的分布式ID生成算法,結(jié)果是一個(gè)long型的ID。其核心思想是:使用41bit作為毫秒數(shù),10bit作為機(jī)器的ID(5個(gè)bit是數(shù)據(jù)中心,5個(gè)bit的機(jī)器ID),12bit作為毫秒內(nèi)的流水號(hào)(意味著每個(gè)節(jié)點(diǎn)在每毫秒可以產(chǎn)生 4096 個(gè) ID),最后還有一個(gè)符號(hào)位,永遠(yuǎn)是0。具體實(shí)現(xiàn)的代碼可以參看:https://github.com/twitter/snowflake

public class IdWorker {
// ==============================Fields===========================================
/** 開始時(shí)間截 (2015-01-01) */
private final long twepoch = 1420041600000L;

/** 機(jī)器id所占的位數(shù) */
private final long workerIdBits = 5L;

/** 數(shù)據(jù)標(biāo)識(shí)id所占的位數(shù) */
private final long datacenterIdBits = 5L;

/** 支持的最大機(jī)器id,結(jié)果是31 (這個(gè)移位算法可以很快的計(jì)算出幾位二進(jìn)制數(shù)所能表示的最大十進(jìn)制數(shù)) */
private final long maxWorkerId = -1L ^ (-1L << workerIdBits);

/** 支持的最大數(shù)據(jù)標(biāo)識(shí)id,結(jié)果是31 */
private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);

/** 序列在id中占的位數(shù) */
private final long sequenceBits = 12L;

/** 機(jī)器ID向左移12位 */
private final long workerIdShift = sequenceBits;

/** 數(shù)據(jù)標(biāo)識(shí)id向左移17位(12+5) */
private final long datacenterIdShift = sequenceBits + workerIdBits;

/** 時(shí)間截向左移22位(5+5+12) */
private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

/** 生成序列的掩碼,這里為4095 (0b111111111111=0xfff=4095) */
private final long sequenceMask = -1L ^ (-1L << sequenceBits);

/** 工作機(jī)器ID(0~31) */
private long workerId;

/** 數(shù)據(jù)中心ID(0~31) */
private long datacenterId;

/** 毫秒內(nèi)序列(0~4095) */
private long sequence = 0L;

/** 上次生成ID的時(shí)間截 */
private long lastTimestamp = -1L;

//==============================Constructors=====================================
/**
 * 構(gòu)造函數(shù)
 * @param workerId 工作ID (0~31)
 * @param datacenterId 數(shù)據(jù)中心ID (0~31)
 */
public IdWorker(long workerId, long datacenterId) {
    if (workerId > maxWorkerId || workerId < 0) {
        throw new IllegalArgumentException(String.format("worker Id can&#39;t be greater than %d or less than 0", maxWorkerId));
    }
    if (datacenterId > maxDatacenterId || datacenterId < 0) {
        throw new IllegalArgumentException(String.format("datacenter Id can&#39;t be greater than %d or less than 0", maxDatacenterId));
    }
    this.workerId = workerId;
    this.datacenterId = datacenterId;
}

// ==============================Methods==========================================
/**
 * 獲得下一個(gè)ID (該方法是線程安全的)
 * @return SnowflakeId
 */
public synchronized long nextId() {
    long timestamp = timeGen();

    //如果當(dāng)前時(shí)間小于上一次ID生成的時(shí)間戳,說明系統(tǒng)時(shí)鐘回退過這個(gè)時(shí)候應(yīng)當(dāng)拋出異常
    if (timestamp < lastTimestamp) {
        throw new RuntimeException(
                String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
    }

    //如果是同一時(shí)間生成的,則進(jìn)行毫秒內(nèi)序列
    if (lastTimestamp == timestamp) {
        sequence = (sequence + 1) & sequenceMask;
        //毫秒內(nèi)序列溢出
        if (sequence == 0) {
            //阻塞到下一個(gè)毫秒,獲得新的時(shí)間戳
            timestamp = tilNextMillis(lastTimestamp);
        }
    }
    //時(shí)間戳改變,毫秒內(nèi)序列重置
    else {
        sequence = 0L;
    }

    //上次生成ID的時(shí)間截
    lastTimestamp = timestamp;

    //移位并通過或運(yùn)算拼到一起組成64位的ID
    return ((timestamp - twepoch) << timestampLeftShift) //
            | (datacenterId << datacenterIdShift) //
            | (workerId << workerIdShift) //
            | sequence;
}

/**
 * 阻塞到下一個(gè)毫秒,直到獲得新的時(shí)間戳
 * @param lastTimestamp 上次生成ID的時(shí)間截
 * @return 當(dāng)前時(shí)間戳
 */
protected long tilNextMillis(long lastTimestamp) {
    long timestamp = timeGen();
    while (timestamp <= lastTimestamp) {
        timestamp = timeGen();
    }
    return timestamp;
}

/**
 * 返回以毫秒為單位的當(dāng)前時(shí)間
 * @return 當(dāng)前時(shí)間(毫秒)
 */
protected long timeGen() {
    return System.currentTimeMillis();
}

//==============================Test=============================================
/** 測(cè)試 */
public static void main(String[] args) {
    IdWorker idWorker = new IdWorker(0, 0);
    for (int i = 0; i < 1000; i++) {
        long id = idWorker.nextId();
        System.out.println(Long.toBinaryString(id));
        System.out.println(id);
    }
}}

snowflake算法可以根據(jù)自身項(xiàng)目的需要進(jìn)行一定的修改。比如估算未來的數(shù)據(jù)中心個(gè)數(shù),每個(gè)數(shù)據(jù)中心的機(jī)器數(shù)以及統(tǒng)一毫秒可以能的并發(fā)數(shù)來調(diào)整在算法中所需要的bit數(shù)。

優(yōu)點(diǎn):

  1. 不依賴于數(shù)據(jù)庫(kù),靈活方便,且性能優(yōu)于數(shù)據(jù)庫(kù)。

  2. ID按照時(shí)間在單機(jī)上是遞增的。

缺點(diǎn):

  1. 在單機(jī)上是遞增的,但是由于涉及到分布式環(huán)境,每臺(tái)機(jī)器上的時(shí)鐘不可能完全同步,也許有時(shí)候也會(huì)出現(xiàn)不是全局遞增的情況。

五、利用zookeeper生成唯一ID?

zookeeper主要通過其znode數(shù)據(jù)版本來生成序列號(hào),可以生成32位和64位的數(shù)據(jù)版本號(hào),客戶端可以使用這個(gè)版本號(hào)來作為唯一的序列號(hào)。

很少會(huì)使用zookeeper來生成唯一ID。主要是由于需要依賴zookeeper,并且是多步調(diào)用API,如果在競(jìng)爭(zhēng)較大的情況下,需要考慮使用分布式鎖。因此,性能在高并發(fā)的分布式環(huán)境下,也不甚理想。

六、MongoDB的ObjectId?

MongoDB的ObjectId和snowflake算法類似。它設(shè)計(jì)成輕量型的,不同的機(jī)器都能用全局唯一的同種方法方便地生成它。MongoDB 從一開始就設(shè)計(jì)用來作為分布式數(shù)據(jù)庫(kù),處理多個(gè)節(jié)點(diǎn)是一個(gè)核心要求。使其在分片環(huán)境中要容易生成得多。其格式如下: [src/main/resources/objectId.png] 這里寫圖片描述:

20180914090405298.png

前4 個(gè)字節(jié)是從標(biāo)準(zhǔn)紀(jì)元開始的時(shí)間戳,單位為秒。時(shí)間戳,與隨后的5 個(gè)字節(jié)組合起來,提供了秒級(jí)別的唯一性。由于時(shí)間戳在前,這意味著ObjectId 大致會(huì)按照插入的順序排列。這對(duì)于某些方面很有用,如將其作為索引提高效率。這4 個(gè)字節(jié)也隱含了文檔創(chuàng)建的時(shí)間。絕大多數(shù)客戶端類庫(kù)都會(huì)公開一個(gè)方法從ObjectId 獲取這個(gè)信息。 接下來的3 字節(jié)是所在主機(jī)的唯一標(biāo)識(shí)符。通常是機(jī)器主機(jī)名的散列值。這樣就可以確保不同主機(jī)生成不同的ObjectId,不產(chǎn)生沖突。 為了確保在同一臺(tái)機(jī)器上并發(fā)的多個(gè)進(jìn)程產(chǎn)生的ObjectId 是唯一的,接下來的兩字節(jié)來自產(chǎn)生ObjectId 的進(jìn)程標(biāo)識(shí)符(PID)。 前9 字節(jié)保證了同一秒鐘不同機(jī)器不同進(jìn)程產(chǎn)生的ObjectId 是唯一的。后3 字節(jié)就是一個(gè)自動(dòng)增加的計(jì)數(shù)器,確保相同進(jìn)程同一秒產(chǎn)生的ObjectId 也是不一樣的。同一秒鐘最多允許每個(gè)進(jìn)程擁有2563(16 777 216)個(gè)不同的ObjectId。

相關(guān)推薦:

php新聞發(fā)布管理系統(tǒng)開發(fā)實(shí)例

PHP開發(fā)簡(jiǎn)單的新聞發(fā)布系統(tǒng)教程

Atas ialah kandungan terperinci 分布式系統(tǒng)唯一ID生成方案匯總. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Cara menggunakan Redis untuk mencapai penyegerakan data teragih Cara menggunakan Redis untuk mencapai penyegerakan data teragih Nov 07, 2023 pm 03:55 PM

Cara menggunakan Redis untuk mencapai penyegerakan data teragih Dengan perkembangan teknologi Internet dan senario aplikasi yang semakin kompleks, konsep sistem teragih semakin diterima pakai secara meluas. Dalam sistem teragih, penyegerakan data merupakan isu penting. Sebagai pangkalan data dalam memori berprestasi tinggi, Redis bukan sahaja boleh digunakan untuk menyimpan data, tetapi juga boleh digunakan untuk mencapai penyegerakan data teragih. Untuk penyegerakan data teragih, biasanya terdapat dua mod biasa: mod terbitkan/langgan (Terbitkan/Langgan) dan replikasi induk-hamba (Master-slave).

Cara Redis melaksanakan pengurusan sesi teragih Cara Redis melaksanakan pengurusan sesi teragih Nov 07, 2023 am 11:10 AM

Cara Redis melaksanakan pengurusan sesi teragih memerlukan contoh kod khusus Pengurusan sesi teragih adalah salah satu topik hangat di Internet hari ini Dalam menghadapi kesesuaian yang tinggi dan volum data yang besar, kaedah pengurusan sesi tradisional secara beransur-ansur menjadi tidak mencukupi. Sebagai pangkalan data nilai kunci berprestasi tinggi, Redis menyediakan penyelesaian pengurusan sesi teragih. Artikel ini akan memperkenalkan cara menggunakan Redis untuk melaksanakan pengurusan sesi teragih dan memberikan contoh kod khusus. 1. Pengenalan kepada Redis sebagai storan sesi teragih Kaedah pengurusan sesi tradisional adalah untuk menyimpan maklumat sesi

Cara menggunakan Swoole untuk melaksanakan penjadualan tugas berjadual teragih Cara menggunakan Swoole untuk melaksanakan penjadualan tugas berjadual teragih Nov 07, 2023 am 11:04 AM

Cara menggunakan Swoole untuk melaksanakan penjadualan tugas berjadual teragih Pengenalan: Dalam pembangunan PHP tradisional, kami sering menggunakan cron untuk melaksanakan penjadualan tugas berjadual, tetapi cron hanya boleh melaksanakan tugas pada pelayan tunggal dan tidak dapat menangani senario konkurensi yang tinggi. Swoole ialah rangka kerja serentak tak segerak berprestasi tinggi berdasarkan PHP Ia menyediakan keupayaan komunikasi rangkaian yang lengkap dan sokongan berbilang proses, membolehkan kami melaksanakan penjadualan tugas berjadual dengan mudah. Artikel ini akan memperkenalkan cara menggunakan Swoole untuk melaksanakan penjadualan tugas berjadual teragih

Menggunakan Redis untuk mencapai ketekalan cache yang diedarkan Menggunakan Redis untuk mencapai ketekalan cache yang diedarkan Nov 07, 2023 pm 12:05 PM

Menggunakan Redis untuk mencapai ketekalan cache teragih Dalam sistem teragih moden, cache memainkan peranan yang sangat penting. Ia boleh mengurangkan kekerapan capaian sistem kepada pangkalan data dan meningkatkan prestasi dan daya pemprosesan sistem. Dalam sistem yang diedarkan, untuk memastikan ketekalan cache, kita perlu menyelesaikan masalah penyegerakan data antara berbilang nod. Dalam artikel ini, kami akan memperkenalkan cara menggunakan Redis untuk mencapai ketekalan cache yang diedarkan dan memberikan contoh kod khusus. Redis ialah pangkalan data nilai kunci berprestasi tinggi yang menyokong kegigihan, replikasi dan pengumpulan

Berkongsi pengalaman menggunakan MongoDB untuk melaksanakan penjadualan dan pelaksanaan tugas teragih Berkongsi pengalaman menggunakan MongoDB untuk melaksanakan penjadualan dan pelaksanaan tugas teragih Nov 02, 2023 am 09:39 AM

MongoDB ialah pangkalan data NoSQL sumber terbuka dengan prestasi tinggi, berskala dan fleksibiliti. Dalam sistem teragih, penjadualan tugas dan pelaksanaan adalah isu utama Dengan menggunakan ciri-ciri MongoDB, penjadualan tugasan dan penyelesaian pelaksanaan boleh direalisasikan. 1. Analisis Keperluan untuk Penjadualan Tugasan Teragih Dalam sistem teragih, penjadualan tugas ialah proses memperuntukkan tugas kepada nod yang berbeza untuk dilaksanakan. Keperluan penjadualan tugas biasa termasuk: 1. Pengagihan permintaan tugas: Hantar permintaan tugas ke nod pelaksanaan yang tersedia.

Kaedah dan teknik untuk membangunkan dan melaksanakan sistem analisis log teragih menggunakan bahasa Go Kaedah dan teknik untuk membangunkan dan melaksanakan sistem analisis log teragih menggunakan bahasa Go Nov 20, 2023 am 10:23 AM

Kaedah dan teknik untuk membangun dan melaksanakan sistem analisis log teragih menggunakan bahasa Go Abstrak: Dengan kemunculan era data besar, analisis log telah menjadi tugas penting untuk perusahaan. Artikel ini memperkenalkan kaedah dan teknik untuk membangunkan dan melaksanakan sistem analisis log teragih berdasarkan bahasa Go. Artikel ini menyediakan analisis terperinci dari aspek reka bentuk seni bina sistem, pengumpulan data, pemprosesan teragih, penyimpanan data dan pertanyaan, dsb., dan menyediakan pembaca dengan satu set garis panduan praktikal. Kata kunci: Bahasa Go; analisis log 1. Pengenalan Dengan perkembangan pesat Internet dan peranti pintar

Menggunakan Redis untuk melaksanakan penjadualan tugas teragih Menggunakan Redis untuk melaksanakan penjadualan tugas teragih Nov 07, 2023 am 08:15 AM

Menggunakan Redis untuk melaksanakan penjadualan tugas teragih Dengan pengembangan perniagaan dan pembangunan sistem, banyak perniagaan perlu melaksanakan penjadualan tugas teragih untuk memastikan tugas boleh dilaksanakan pada berbilang nod pada masa yang sama, dengan itu meningkatkan kestabilan dan ketersediaan sistem. Sebagai produk penyimpanan data memori berprestasi tinggi, Redis mempunyai ciri pengedaran, ketersediaan tinggi dan prestasi tinggi, dan sangat sesuai untuk melaksanakan penjadualan tugas teragih. Artikel ini akan memperkenalkan cara menggunakan Redis untuk melaksanakan penjadualan tugas teragih dan menyediakan contoh kod yang sepadan. 1. Pangkalan Redis

Butiran, teknik dan amalan terbaik untuk melaksanakan pengumpulan dan analisis log yang diedarkan dengan Golang dan RabbitMQ Butiran, teknik dan amalan terbaik untuk melaksanakan pengumpulan dan analisis log yang diedarkan dengan Golang dan RabbitMQ Sep 27, 2023 pm 12:31 PM

Butiran, teknik dan amalan terbaik untuk melaksanakan pengumpulan dan analisis log yang diedarkan dengan Golang dan RabbitMQ Dalam beberapa tahun kebelakangan ini, dengan populariti seni bina perkhidmatan mikro dan kerumitan sistem berskala besar, pengumpulan dan analisis log telah menjadi semakin penting. Dalam sistem yang diedarkan, log setiap perkhidmatan mikro sering bertaburan di tempat yang berbeza Cara mengumpul dan menganalisis log ini dengan cekap menjadi satu cabaran. Artikel ini akan memperkenalkan butiran, teknik dan amalan terbaik tentang cara menggunakan Golang dan RabbitMQ untuk melaksanakan pengumpulan dan analisis log teragih. Ra

See all articles