etcd中用lease租約實現過期


 etcd中用lease租約實現過期。

 簡單紀錄一下在etcd中利用lease實現kv過期的功能。

 

其實思路很簡單:

1.申請一個lease,且給這個租約設置一個ttl,比如設置這個ttl為1秒。

2.然后將這個lease與kv的操作關聯起來,那么1s后這個就過期了。

 

需要注意的是:

1.centos里的端口要放開。

 

代碼如下:

/*
  author='du'
  date='2020/5/28 7:17'
*/
package main

import (
    "context"
    "fmt"
    "github.com/coreos/etcd/clientv3"
    "time"
)

func main() {
    var (
        client         *clientv3.Client
        lease          clientv3.Lease
        leaseGrantResp *clientv3.LeaseGrantResponse
        leaseId        clientv3.LeaseID
        kv             clientv3.KV
        putResp        *clientv3.PutResponse
        getResp        *clientv3.GetResponse
    )

    //客戶端配置
    config := clientv3.Config{
        Endpoints:   []string{"129.211.78.6:2379"},
        DialTimeout: 5 * time.Second,
    }

    //建立連接
    client, err := clientv3.New(config)
    if err != nil {
        fmt.Printf("連接失敗:%s", err)
        return
    }

    //申請一個租約
    lease = clientv3.NewLease(client)

    //申請一個5s的租約。
    if leaseGrantResp, err = lease.Grant(context.TODO(), 5); err != nil {
        fmt.Println(err)
        return
    }
    leaseId = leaseGrantResp.ID

    //獲取kv,然后Put kv,將之和租約關聯起來,實現過期的效果
    kv = clientv3.KV(client)
    if putResp, err = kv.Put(context.TODO(), "/cron/lock/job1", "", clientv3.WithLease(leaseId)); err != nil {
        return
    }
    fmt.Println("寫入成功,當前revision是:", putResp.Header.Revision)

    //模擬數據,每1s去get一下數據,看5s后數據有無過期
    for {
        if getResp, err = kv.Get(context.TODO(), "/cron/lock/job1"); err != nil {
            fmt.Println(err)
            return
        }
        if getResp.Count == 0 {
            fmt.Println("未獲取到數據,已經過期了。")
            break
        }
        fmt.Println("還木有過期,當前數據", getResp.Kvs)
        time.Sleep(1 * time.Second)
    }

}

 

由代碼,我們可以看到設置了一個5s的ttl,那么看一下效果吧:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM