UUID(Universally Unique Identifier),通用惟一識別碼。
UUID是指在一臺機器上生成的數字,它保證對在同一時空中的全部機器都是惟一的php
UUID 由如下幾個部分組成:
1)當前日期和時間
2)時鐘序列
3)全局惟一的IEEE機器識別號,若是有網卡,從網卡MAC地址得到,沒有網卡以其餘方式得到。redis
生成 uuid:算法
public function create_guid($namespace = '') { static $guid = ''; $uid = uniqid("", true); $data = $namespace; $data .= $_SERVER['REQUEST_TIME']; $data .= $_SERVER['HTTP_USER_AGENT']; $data .= $_SERVER['LOCAL_ADDR']; $data .= $_SERVER['LOCAL_PORT']; $data .= $_SERVER['REMOTE_ADDR']; $data .= $_SERVER['REMOTE_PORT']; $hash = strtoupper(hash('md5', $uid . $guid . md5($data))); $guid = '{' . substr($hash, 0, 8) . '-' . substr($hash, 8, 4) . '-' . substr($hash, 12, 4) . '-' . substr($hash, 16, 4) . '-' . substr($hash, 20, 12) . '}'; return $guid; }
生成 logid:根據時序生成的 id數據庫
public static function logid(){ $arr = gettimeofday(); $aa = ($arr['sec']*100000 + $arr['usec']/10) & 0x7FFFFFFF; $logId = ((($arr['sec']*100000 + $arr['usec']/10) & 0x7FFFFFFF) | 0x80000000); return $logId }
snowflake:併發
twitter在把存儲系統從MySQL遷移到Cassandra的過程當中因爲Cassandra沒有順序ID生成機制,因而本身開發了一套全局惟一ID生成的服務:snowflake。其核心思想是:一個long型的ID,使用其中41bit做爲毫秒數,10bit做爲機器編號,12bit做爲毫秒內序列號。 運維
算法高併發 |
優勢ui |
缺點spa |
適用場景code |
---|---|---|---|
auto_increment |
數據庫本身實現,使用方便 |
存在單點問題,且有寫入瓶頸 |
業務體量較小,併發數小,絕對遞增 |
uuid | 本地生成時效性高 | 須要獨立部署和維護,string類型作索引查詢效率低,極低機率出現重複 | 高併發、趨勢遞增 |
snowflake | 本地生成時效性高 | 須要獨立部署和維護 | 高併發、趨勢遞增 |
redis incr | 實現靈活、簡單 | 須要一次redis調用 | 併發要求不高,趨勢遞增 |
idalloc | 內部維護服務 | 須要獨立部署和運維 | 高併發,趨勢遞增 |