<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] > [github.com](https://learnku.com/articles/37343#c23c9b) ## 安裝 `go get github.com/coreos/etcd/clientv3 ` ## clientv3.New( 連接 ``` client, err := clientv3.New(clientv3.Config{ Endpoints: []string{"localhost:2379"}, // Endpoints: []string{"localhost:2379", "localhost:22379", "localhost:32379"} DialTimeout: 5 * time.Second, }) type Client struct { Cluster //向集群里增加 etcd 服務端節點之類,屬于管理員操作。 KV //我們主要使用的功能,即 K-V 鍵值庫的操作 Lease //租約相關操作,比如申請一個 TTL=10 秒的租約(應用給 key 可以實現鍵值的自動過期) Watcher //觀察訂閱,從而監聽最新的數據變化 Auth //管理 etcd 的用戶和權限,屬于管理員操作 Maintenance //維護 etcd,比如主動遷移 etcd 的 leader 節點,屬于管理員操作 Username string Password string } ``` ## clientv3.NewKV 操作kv ``` kv := clientv3.NewKV(cli) ``` ### Put ``` putResp, err := kv.Put(context.TODO(),"/test/key1", "hello") fmt.Printf("PutResponse: %v, err: %v", putResp, err) // PutResponse: &{cluster\_id:14841639068965178418 member\_id:10276657743932975437 revision:3 raft\_term:7 }, err: % ``` ### Get #### 獲取一條 ``` getResp, _ := kv.Get(context.TODO(), "/test/key1") fmt.Printf("%+v\n", getResp) fmt.Println(getResp.Header.GetClusterId())//17237436991929493444 fmt.Println(getResp.Header.GetMemberId()) //18249187646912138824 fmt.Println(string(getResp.Kvs[0].Value)) //hello ``` #### 獲取目錄下的內容 根據路徑識別本質就是類似 sql 的like 語句 "foo%" ``` getResp, _ := kv.Get(context.TODO(), "/test/",clientv3.WithPrefix()) fmt.Println(string(getResp.Kvs[0].Value)) //hello fmt.Println(string(getResp.Kvs[1].Value)) //Hello World! ``` #### Lease 設置自動過期key ``` Grant:分配一個租約。 Revoke:釋放一個租約。 TimeToLive:獲取剩余 TTL 時間。 Leases:列舉所有 etcd 中的租約。 KeepAlive:自動定時的續約某個租約。 KeepAliveOnce:為某個租約續約一次。 Close:釋放當前客戶端建立的所有租約。 ``` ``` // 設置一個 10s 過期的 lease lease := clientv3.NewLease(client) response, e := lease.Grant(context.TODO(), 10) // Put 之前 Lease 已經過期了,返回error kv.Put(context.TODO(), "/test/vanish", "vanish in 10s", clientv3.WithLease(response.ID)) getResponse, _ := kv.Get(context.TODO(), "/test/vanish") fmt.Println(string(getResponse.Kvs[0].Value)) // vanish in 10s time.Sleep(11*time.Second) getResponse, _= kv.Get(context.TODO(), "/test/vanish") fmt.Println(string(getResponse.Kvs[0].Value)) // 報錯,沒有值 ``` ### Op ``` kv.Do(context.TODO(),clientv3.OpPut("/test/key3","Hello World!")) //等于 kv.Put(context.TODO(),"/test/key3", "Hello World!") ``` ### Txn 事務 ``` kv.Txn(context.TODO()).If( clientv3.Compare(clientv3.Value(k1), ">", v1), clientv3.Compare(clientv3.Version(k1), "=", 2) ).Then( clientv3.OpPut(k2,v2), clentv3.OpPut(k3,v3) ).Else( clientv3.OpPut(k4,v4), clientv3.OpPut(k5,v5) ).Commit() ``` ### Watch ``` kv := clientv3.NewKV(client) kv.Put(context.TODO(), "/test/key1", "hello") watcher := clientv3.NewWatcher(client) watch := watcher.Watch(context.TODO(), "/test/key1") go func() { for{ select { case <- watch: response, _ := kv.Get(context.TODO(), "/test/key1") fmt.Printf("%+v\n", response) default: // fmt.Println("sleep 1s ") time.Sleep(1*time.Second) } } }() go func() { time.Sleep(1*time.Second) kv.Put(context.TODO(),"/test/key1","hello2") }() ``` ### 使用 etcd 簡化版 embed 用于單元測試 ``` package main import ( "context" "fmt" "log" "net/http" "time" "go.etcd.io/etcd/v3/embed" ) func main() { cfg := embed.NewConfig() e, err := embed.StartEtcd(cfg) if err != nil { log.Fatal(err) } defer e.Close() select { case <-e.Server.ReadyNotify(): fmt.Println("Server is ready!") case <-time.After(60 * time.Second): e.Server.Stop() // trigger a shutdown fmt.Println("Server took too long to start!") } // Example: put a key, get a key cli, err := e.Client() if err != nil { log.Fatal(err) } key := "exampleKey" value := "exampleValue" ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) _, err = cli.Put(ctx, key, value) cancel() if err != nil { log.Fatal(err) } getResp, err := cli.Get(context.Background(), key) if err != nil { log.Fatal(err) } for _, kv := range getResp.Kvs { fmt.Printf("Key: %s, Value: %s\n", kv.Key, kv.Value) } // Example: HTTP API go func() { if err := http.ListenAndServe(":2379", e.Server); err != nil { log.Fatal(err) } }() // Your application logic goes here... select {} } ```
                  <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>

                              哎呀哎呀视频在线观看