zoukankan      html  css  js  c++  java
  • 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,那么看一下效果吧:

  • 相关阅读:
    PHP—字符串编码
    使用html模板
    创建html模板
    默认.htpl改为.htpl
    eclipse导入项目前面有感叹号
    eclipse点不出方法
    eclipse界面混乱
    面试题
    多线程
    瀑布流
  • 原文地址:https://www.cnblogs.com/anmutu/p/12981999.html
Copyright © 2011-2022 走看看