Golang从etcd读取所有值到map的实现方法

Golang从etcd读取所有值到map的实现方法 你好, 我想了解如何将ETCD中的所有键值对读取到Golang的Map中。我需要创建一个缓存服务来保存这些值,这样我就可以从缓存服务中读取数据,而不是直接访问ETCD。 谢谢 🙂

3 回复

遵循 @Giulio_lotti 的想法。避免在映射、内存或任何其他地方创建此缓存。ETCD 在概念上就是一个哈希映射。所以这很棒。

更多关于Golang从etcd读取所有值到map的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不确定你的做法是否明智,但如果你确实需要…

编写一个 etcd 客户端:(1) 读取所有条目(使用带递归选项的 client.Get("/")),(2) 订阅所有后续变更(使用带递归选项的 client.Watch("/"))。

package client

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

func main() {
    cli, err := clientv3.New(clientv3.Config{
        Endpoints: []string{"localhost:2379"},
    })
    if err != nil {
        panic(err)
    }
    defer cli.Close()

    // 获取所有键值对
    resp, err := cli.Get(context.Background(), "/", clientv3.WithPrefix())
    if err != nil {
        panic(err)
    }

    // 监听所有变更
    rch := cli.Watch(context.Background(), "/", clientv3.WithPrefix())
    for wresp := range rch {
        for _, ev := range wresp.Events {
            // 处理事件
        }
    }
}

但是… 你的做法可能并不妥当。如果直接使用 etcd,它的表现会更好。

以下是使用Go语言从etcd读取所有键值对并存储到map中的实现方法。这里使用etcd客户端v3版本,假设你已经安装了go.etcd.io/etcd/clientv3包。

首先,确保导入必要的包并建立etcd客户端连接。然后使用Get方法获取所有键值对,并通过遍历结果填充到map中。

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"go.etcd.io/etcd/clientv3"
)

func main() {
	// 配置etcd客户端
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"localhost:2379"}, // 替换为你的etcd端点
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		log.Fatal(err)
	}
	defer cli.Close()

	// 创建上下文,设置超时时间
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	// 使用Get方法获取所有键值对,key为空字符串表示获取所有
	resp, err := cli.Get(ctx, "", clientv3.WithPrefix())
	if err != nil {
		log.Fatal(err)
	}

	// 初始化map来存储键值对
	etcdMap := make(map[string]string)

	// 遍历响应中的键值对并填充map
	for _, kv := range resp.Kvs {
		etcdMap[string(kv.Key)] = string(kv.Value)
	}

	// 打印map内容以验证
	for key, value := range etcdMap {
		fmt.Printf("Key: %s, Value: %s\n", key, value)
	}
}

代码说明:

  • 使用clientv3.New创建etcd客户端连接,指定端点(例如本地localhost:2379)和超时时间。
  • 通过cli.Get方法获取所有键值对:WithPrefix()选项确保获取所有前缀的键(空字符串匹配所有键)。
  • 遍历响应中的Kvs字段(类型为[]*mvccpb.KeyValue),将每个键值对转换为字符串并存储到map中。
  • 最后,遍历map并打印键值对以验证结果。

注意事项:

  • 如果etcd中的数据量很大,可能需要分页处理(例如使用WithLimitWithFromKey),但此示例适用于一般场景。
  • 确保etcd服务运行并可访问,否则连接会失败。
  • 在实际缓存服务中,你可能需要定期刷新map或处理etcd的watch事件来更新缓存。

这个示例提供了一个基础框架,你可以根据需要扩展为完整的缓存服务,例如添加定时刷新或错误处理逻辑。

回到顶部