package main

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

func main(){
    var (
        config clientv3.Config
        err error
        client *clientv3.Client
    )
    //配置
    config = clientv3.Config{
        Endpoints:[]string{"192.168.1.188:2379"},
        DialTimeout:time.Second*5,
    }
    //连接
    if client,err = clientv3.New(config);err != nil{
        fmt.Println(err)
        return
    }
    client=client
}

 

 

package main

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

func main(){
    var (
        config clientv3.Config
        err error
        client *clientv3.Client
        kv clientv3.KV
        putResp *clientv3.PutResponse

    )
    //配置
    config = clientv3.Config{
        Endpoints:[]string{"192.168.1.188:2379"},
        DialTimeout:time.Second*5,
    }
    //连接 床见一个客户端
    if client,err = clientv3.New(config);err != nil{
        fmt.Println(err)
        return
    }
    //用于读写etcd的键值对
    kv = clientv3.NewKV(client)
    putResp, err = kv.Put(context.TODO(),"/cron/jobs/job1","bye",clientv3.WithPrevKV())
    if err != nil{
        fmt.Println(err)
    }else{
        //获取版本信息
        fmt.Println("Revision:",putResp.Header.Revision)
        if putResp.PrevKv != nil{
            fmt.Println("key:",string(putResp.PrevKv.Key))
            fmt.Println("Value:",string(putResp.PrevKv.Value))
            fmt.Println("Version:",string(putResp.PrevKv.Version))
        }
    }
}

 

Revision: 10
key: /cron/jobs/job1
Value: hello
Version: 

get

package main

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

func main(){
    var (
        config clientv3.Config
        err error
        client *clientv3.Client
        kv clientv3.KV
        getResp *clientv3.GetResponse

    )
    //配置
    config = clientv3.Config{
        Endpoints:[]string{"192.168.1.188:2379"},
        DialTimeout:time.Second*5,
    }
    //连接 床见一个客户端
    if client,err = clientv3.New(config);err != nil{
        fmt.Println(err)
        return
    }


    //用于读写etcd的键值对
    kv = clientv3.NewKV(client)

    getResp,err = kv.Get(context.TODO(),"/cron/jobs/job1")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(getResp.Kvs)
}

 

[key:"/cron/jobs/job1" create_revision:4 mod_revision:11 version:5 value:"bye" ]

 

with用法

//用于读写etcd的键值对
    kv = clientv3.NewKV(client)

    getResp,err = kv.Get(context.TODO(),"/cron/jobs/job1",clientv3.WithCountOnly())
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(getResp.Kvs,getResp.Count)
[] 1

 

读取前缀

//用于读写etcd的键值对
    kv = clientv3.NewKV(client)

    //读取前缀
    getResp,err = kv.Get(context.TODO(),"/cron/jobs/",clientv3.WithPrefix())
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(getResp.Kvs)

 

[key:"/cron/jobs/job1" create_revision:4 mod_revision:11 version:5 value:"bye"  
key:"/cron/jobs/job2" create_revision:12 mod_revision:12 version:1 value:"byehhhhhh" ]

 

Delete

    //用于读写etcd的键值对
    kv = clientv3.NewKV(client)

    delResp,err = kv.Delete(context.TODO(),"/cron/jobs/job2",clientv3.WithPrevKV())
    if err != nil{
        fmt.Println(err)
        return
    }else{
        if len(delResp.PrevKvs) > 0 {
            for idx,kvpair = range delResp.PrevKvs{
                idx = idx
                fmt.Println("删除了",string(kvpair.Key),string(kvpair.Value))
            }
        }
    }

 

byehhhhhh

 

删除多个key

delResp,err = kv.Delete(context.TODO(),"/cron/jobs",clientv3.WithPrefix())

续租:

package main

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

func main(){
    var (
        config clientv3.Config
        err error
        client *clientv3.Client
        kv clientv3.KV
        lease clientv3.Lease
        leaseid clientv3.LeaseID
        leaseGrantResp *clientv3.LeaseGrantResponse
        putResp *clientv3.PutResponse
        getResp *clientv3.GetResponse
        //keepresp *clientv3.LeaseKeepAliveResponse
        //keepRestChan <-chan *clientv3.LeaseKeepAliveResponse

    )
    //配置
    config = clientv3.Config{
        Endpoints:[]string{"192.168.1.188:2379"},
        DialTimeout:time.Second*5,
    }
    //连接 床见一个客户端
    if client,err = clientv3.New(config);err != nil{
        fmt.Println(err)
        return
    }




    //申请一个lease 租约
    lease = clientv3.NewLease(client)

    //申请一个10秒的租约
    if leaseGrantResp, err = lease.Grant(context.TODO(),10);err != nil{
        fmt.Println(err)
        return
    }



    //拿到租约id
    leaseid = leaseGrantResp.ID

    //获得kv api子集
    kv = clientv3.NewKV(client)


    //put一个kv 让它与租约关联起来 从而实现10秒自动过期
    if putResp,err = kv.Put(context.TODO(),"cron/lock/job1","v5",clientv3.WithLease(leaseid));err != nil{
        fmt.Println(err)
        return
    }

    fmt.Println("写入成功",putResp.Header.Revision)

    //定时的看一下key过期了没有
    for{
        if getResp,err = kv.Get(context.TODO(),"cron/lock/job1");err != nil{
            fmt.Println(err)
            return
        }
        if getResp.Count == 0{
            fmt.Println("kv过期了")
            break
        }
        fmt.Println("还没过期:",getResp.Kvs)
        time.Sleep(time.Second*2)
    }
}

 

写入成功 24
还没过期: [key:"cron/lock/job1" create_revision:24 mod_revision:24 version:1 value:"v5" lease:7587840069550468387 ]
还没过期: [key:"cron/lock/job1" create_revision:24 mod_revision:24 version:1 value:"v5" lease:7587840069550468387 ]
还没过期: [key:"cron/lock/job1" create_revision:24 mod_revision:24 version:1 value:"v5" lease:7587840069550468387 ]
还没过期: [key:"cron/lock/job1" create_revision:24 mod_revision:24 version:1 value:"v5" lease:7587840069550468387 ]
还没过期: [key:"cron/lock/job1" create_revision:24 mod_revision:24 version:1 value:"v5" lease:7587840069550468387 ]
还没过期: [key:"cron/lock/job1" create_revision:24 mod_revision:24 version:1 value:"v5" lease:7587840069550468387 ]
kv过期了

 

永不过期的租约

package main

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

func main(){
    var (
        config clientv3.Config
        err error
        client *clientv3.Client
        kv clientv3.KV
        lease clientv3.Lease
        leaseid clientv3.LeaseID
        leaseGrantResp *clientv3.LeaseGrantResponse
        putResp *clientv3.PutResponse
        getResp *clientv3.GetResponse
        keepresp *clientv3.LeaseKeepAliveResponse
        keepRestChan <-chan *clientv3.LeaseKeepAliveResponse

    )
    //配置
    config = clientv3.Config{
        Endpoints:[]string{"192.168.1.188:2379"},
        DialTimeout:time.Second*5,
    }
    //连接 床见一个客户端
    if client,err = clientv3.New(config);err != nil{
        fmt.Println(err)
        return
    }




    //申请一个lease 租约
    lease = clientv3.NewLease(client)

    //申请一个10秒的租约
    if leaseGrantResp, err = lease.Grant(context.TODO(),10);err != nil{
        fmt.Println(err)
        return
    }

    //拿到租约id
    leaseid = leaseGrantResp.ID

    //获得kv api子集
    kv = clientv3.NewKV(client)


    //自动续租
    if keepRestChan,err = lease.KeepAlive(context.TODO(),leaseid);err != nil{
        fmt.Println(err)
        return
    }
    //处理续租应答的协程
    go func() {
        for {
            select {
                case keepresp = <-keepRestChan:
                    if keepRestChan == nil{
                        fmt.Println("租约已失效了")
                        goto END
                    }else{//每秒会续租一次,所以就会收到一次应答
                        fmt.Println("收到自动续租的应答")
                    }
            }
        }
        END:
    }()





    //put一个kv 让它与租约关联起来 从而实现10秒自动过期
    if putResp,err = kv.Put(context.TODO(),"cron/lock/job1","v5",clientv3.WithLease(leaseid));err != nil{
        fmt.Println(err)
        return
    }

    fmt.Println("写入成功",putResp.Header.Revision)

    //定时的看一下key过期了没有
    for{
        if getResp,err = kv.Get(context.TODO(),"cron/lock/job1");err != nil{
            fmt.Println(err)
            return
        }
        if getResp.Count == 0{
            fmt.Println("kv过期了")
            break
        }
        fmt.Println("还没过期:",getResp.Kvs)
        time.Sleep(time.Second*2)
    }
}
View Code

相关文章:

  • 2021-08-31
  • 2021-11-28
  • 2022-12-23
  • 2022-12-23
  • 2021-07-06
  • 2021-07-20
  • 2021-07-27
猜你喜欢
  • 2021-08-19
  • 2021-06-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-04
  • 2022-12-23
相关资源
相似解决方案