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,那么看一下效果吧: