<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] > [參考](https://chai2010.cn/advanced-go-programming-book/ch6-cloud/ch6-01-dist-id.html) ## 概述 在插入數據庫之前,我們需要給這些消息、訂單先打上一個ID,然后再插入到我們的數據庫。對這個id的要求是希望其中能帶有一些時間信息,這樣即使我們后端的系統對消息進行了分庫分表,也能夠以時間順序對這些消息進行排序 ## Twitter的snowflake算法 ![](../../images/screenshot_1654350944627.png) id 大小為 int64位,被劃分為四部分,不含開頭的第一個bi,用41位來表示收到請求時的時間戳,單位為毫秒,然后五位來表示數據中心的id,然后再五位來表示機器的實例id,最后是12位的循環自增id(到達1111,1111,1111后會歸0) 表示`timestamp`的41位,可以支持我們使用69年,所以這里的`timestamp`只是相對于某個時間的增量,比如我們的系統上線是2018-08-01,那么我們可以把這個timestamp當作是從`2018-08-01 00:00:00.000`的偏移量 ### worker_id分配 `timestamp`,`datacenter_id`,`worker_id`和`sequence_id`這四個字段中,`timestamp`和`sequence_id`是由程序在運行期生成的。但`datacenter_id`和`worker_id`需要我們在部署階段就能夠獲取得到 一般不同數據中心的機器,會提供對應的獲取數據中心id的API,所以`datacenter_id`我們可以在部署階段輕松地獲取到 worker_id是我們邏輯上給機器分配的一個id,有兩種方式生成 1. 使用mysql的自增id,但是引入 mysql 增加對外部的依賴 ``` mysql> insert into a (ip) values("10.1.2.101"); Query OK, 1 row affected (0.00 sec) mysql> select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 2 | +------------------+ 1 row in set (0.00 sec) ``` 2. `worker_id`直接寫在worker的配置中,上線時,由部署腳本完成`worker_id`字段替換 ### go 實現 ``` package main import ( "fmt" "os" "github.com/bwmarrin/snowflake" ) func main() { n, err := snowflake.NewNode(1) if err != nil { println(err) os.Exit(1) } for i := 0; i < 3; i++ { id := n.Generate() fmt.Println("id", id) fmt.Println( "node: ", id.Node(), "step: ", id.Step(), "time: ", id.Time(), "\n", ) } } ``` ## sonyflake 算法 ![](blob:http://www.hmoore.net/c923063a-76c6-4961-9c26-8c69ebd9febd)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看