wordpress自定義二級(jí)菜單的標(biāo)簽網(wǎng)絡(luò)優(yōu)化app
-
MySQL分布式架構(gòu)主鍵ID的設(shè)置方法
- 雪花算法(Snowflake)
- 原理:雪花算法是一種生成分布式唯一ID的算法。它由64位二進(jìn)制數(shù)組成,結(jié)構(gòu)如下:1位符號(hào)位(固定為0) + 41位時(shí)間戳(表示從一個(gè)固定時(shí)間開始到現(xiàn)在的毫秒數(shù))+ 10位工作機(jī)器ID(可以用來區(qū)分不同的機(jī)器或節(jié)點(diǎn))+ 12位序列號(hào)(在同一毫秒內(nèi)對(duì)不同的ID請(qǐng)求進(jìn)行區(qū)分)。
- 優(yōu)點(diǎn):生成的ID是趨勢(shì)遞增的,具有唯一性,并且在分布式系統(tǒng)中各個(gè)節(jié)點(diǎn)可以獨(dú)立生成,不需要依賴中心節(jié)點(diǎn)協(xié)調(diào)。同時(shí),由于包含時(shí)間戳信息,在一定程度上可以根據(jù)ID判斷生成的先后順序。
- 示例實(shí)現(xiàn)(以Java為例):
public class SnowflakeIdGenerator {// 起始的時(shí)間戳private static final long START_STAMP = 1480166465631L;// 每一部分占用的位數(shù)private static final long SEQUENCE_BIT = 12;private static final long MACHINE_BIT = 10;private static final long TIMESTAMP_BIT = 41;// 每一部分的最大值private static final long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);private static final long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);// 每一部分向左的位移private static final long MACHINE_LEFT = SEQUENCE_BIT;private static final long TIMESTAMP_LEFT = SEQUENCE_BIT + MACHINE_BIT;private long machineId;private long sequence = 0L;private long lastStamp = -1L;public SnowflakeIdGenerator(long machineId) {if (machineId > MAX_MACHINE_NUM || machineId < 0) {throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");}this.machineId = machineId;}public synchronized long nextId() {long currStamp = getNewStamp();if (currStamp < lastStamp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id");}if (currStamp == lastStamp) {sequence = (sequence + 1) & MAX_SEQUENCE;if (sequence == 0L) {currStamp = getNextStamp(lastStamp);}} else {sequence = 0L;}lastStamp = currStamp;return (currStamp - START_STAMP) << TIMESTAMP_LEFT| machineId << MACHINE_LEFT| sequence;}private long getNextStamp(long lastStamp) {long stamp = getNewStamp();while (stamp <= lastStamp) {stamp = getNewStamp();}return stamp;}private long getNewStamp() {return System.currentTimeMillis();} }
- 基于數(shù)據(jù)庫的全局唯一ID生成器
- 原理:利用數(shù)據(jù)庫的特性來生成唯一ID。例如,在MySQL中可以創(chuàng)建一個(gè)專門用于生成ID的表,表中只有一個(gè)字段(如id字段),每次需要生成ID時(shí),通過對(duì)這個(gè)表進(jìn)行插入操作(插入一條空記錄),然后獲取這個(gè)新插入記錄的自增ID值,再將這個(gè)記錄刪除。這樣就可以得到一個(gè)全局唯一的ID。
- 優(yōu)點(diǎn):簡(jiǎn)單直接,能保證唯一性。
- 缺點(diǎn):性能較差,因?yàn)樯婕暗綌?shù)據(jù)庫的插入和刪除操作,并且需要頻繁訪問數(shù)據(jù)庫,不適合高并發(fā)場(chǎng)景。
- 雪花算法(Snowflake)
-
不能使用自增ID的原因(在分布式架構(gòu)下)
- 數(shù)據(jù)合并問題:在分布式環(huán)境中,可能存在多個(gè)數(shù)據(jù)庫實(shí)例或者節(jié)點(diǎn)。如果每個(gè)節(jié)點(diǎn)都使用自增ID,當(dāng)需要將這些節(jié)點(diǎn)的數(shù)據(jù)合并到一起時(shí),就會(huì)出現(xiàn)ID沖突的問題。例如,節(jié)點(diǎn)A生成的自增ID范圍是1 - 1000,節(jié)點(diǎn)B生成的自增ID范圍是1 - 1000,當(dāng)合并數(shù)據(jù)時(shí),就會(huì)有很多相同的ID,導(dǎo)致數(shù)據(jù)混亂。
- 水平擴(kuò)展受限:自增ID依賴于單個(gè)數(shù)據(jù)庫實(shí)例的順序生成機(jī)制。在分布式架構(gòu)下,如果要進(jìn)行水平擴(kuò)展,添加新的數(shù)據(jù)庫節(jié)點(diǎn)時(shí),難以保證新節(jié)點(diǎn)生成的ID與現(xiàn)有節(jié)點(diǎn)的ID不沖突且能保持全局唯一。
-
不能使用UUID的原因(在某些情況下)
- 存儲(chǔ)空間較大:UUID是128位的通用唯一識(shí)別碼,相比其他的ID生成方式(如32位或64位的雪花算法生成的ID),UUID占用的存儲(chǔ)空間更大。在數(shù)據(jù)庫中,如果大量使用UUID作為主鍵,會(huì)增加數(shù)據(jù)庫的存儲(chǔ)成本。
- 性能問題:UUID是無序的,在數(shù)據(jù)庫中,尤其是在使用基于B - Tree結(jié)構(gòu)(如MySQL的InnoDB存儲(chǔ)引擎)的索引時(shí),無序的UUID會(huì)導(dǎo)致索引樹的頻繁分裂和重組。這是因?yàn)樾虏迦氲腢UID可能隨機(jī)分布在索引樹的各個(gè)位置,而不像自增ID那樣順序插入。這種頻繁的分裂和重組會(huì)降低數(shù)據(jù)庫的插入性能,并且隨著數(shù)據(jù)量的增加,這種性能影響會(huì)更加明顯。