golang支持分片和SASL认证的Memcached二进制客户端插件库gomemcached的使用

Golang支持分片和SASL认证的Memcached二进制客户端插件库gomemcached的使用

简介

Gomemcached是一个Golang Memcached客户端,设计用于与多个实例作为分片进行交互。使用一致性哈希实现分片。

Gomemcached Logo

配置

使用Headless服务地址配置

- name: MEMCACHED_HEADLESS_SERVICE_ADDRESS
  value: "my-memchached-service-headless.namespace.svc.cluster.local"

MEMCACHED_HEADLESS_SERVICE_ADDRESS通过DNS查找按IP地址分组所有memcached实例。

默认Memcached端口是11211,但您也可以在配置中指定:

- name: MEMCACHED_PORT
  value: "12345"

手动指定服务器

对于本地运行或如果您有固定数量和设置的pod,您可以手动指定服务器(逗号分隔的列表,包括端口),而不是设置HeadlessServiceAddress:

- name: MEMCACHED_SERVERS
  value: "127.0.0.1:11211,192.168.0.1:1234"

使用示例

基本初始化

初始化客户端并连接到memcached服务器:

mcl, err := memcached.InitFromEnv()
mustInit(err)
a.AddCloser(func () error {
    mcl.CloseAllConns()
    return nil
})

使用SASL认证

要使用SASL,为InitFromEnv指定选项:

memcached.InitFromEnv(memcached.WithAuthentication("<login>", "<password>"))

可以使用Options与InitFromEnv来自定义客户端以满足您的需求。然而,对于基本使用,建议使用默认的客户端实现。

完整示例Demo

package main

import (
	"fmt"
	"log"

	"github.com/aliexpressru/gomemcached/memcached"
)

func main() {
	// 初始化带SASL认证的客户端
	client, err := memcached.InitFromEnv(
		memcached.WithAuthentication("myuser", "mypassword"),
	)
	if err != nil {
		log.Fatalf("初始化Memcached客户端失败: %v", err)
	}
	defer client.CloseAllConns()

	// 设置键值
	err = client.Set(&memcached.Item{
		Key:   "testKey",
		Value: []byte("testValue"),
	})
	if err != nil {
		log.Printf("设置键值失败: %v", err)
	}

	// 获取键值
	item, err := client.Get("testKey")
	if err != nil {
		log.Printf("获取键值失败: %v", err)
	} else {
		fmt.Printf("获取到的值: %s\n", item.Value)
	}

	// 删除键
	err = client.Delete("testKey")
	if err != nil {
		log.Printf("删除键失败: %v", err)
	}
}

推荐版本

该项目使用以下推荐版本开发和测试:

  • Go: 1.21或更高
  • Memcached: 1.6.9或更高

依赖项

该项目使用以下第三方库,每个库都受MIT许可证管辖:

  1. gomemcache

    • 描述: 一个用于memcached服务器的Go客户端库
    • 用途: 与库交互的主要客户端方法
    • 许可证: Apache License 2.0
  2. go-zero

    • 描述: 一个云原生Go微服务框架,带有提高生产力的CLI工具
    • 用途: 一致性哈希的实现
    • 许可证: MIT License
  3. gomemcached

    • 描述: 一个用于go的memcached二进制协议工具包
    • 用途: Memcached二进制客户端的实现
    • 许可证: MIT License

更多关于golang支持分片和SASL认证的Memcached二进制客户端插件库gomemcached的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang支持分片和SASL认证的Memcached二进制客户端插件库gomemcached的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用gomemcached库实现支持分片和SASL认证的Memcached客户端

gomemcached是一个Go语言的Memcached客户端库,支持二进制协议、连接池、分片和SASL认证等功能。下面我将详细介绍如何使用这个库。

基本安装

首先安装gomemcached库:

go get github.com/bradfitz/gomemcache/memcache

基本使用示例

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/bradfitz/gomemcache/memcache"
)

func main() {
	// 创建客户端,连接到单个Memcached服务器
	mc := memcache.New("localhost:11211")
	
	// 设置键值对
	item := &memcache.Item{
		Key:        "foo",
		Value:      []byte("bar"),
		Expiration: 32, // 32秒后过期
	}
	err := mc.Set(item)
	if err != nil {
		log.Fatal(err)
	}

	// 获取值
	it, err := mc.Get("foo")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Key: %s, Value: %s\n", it.Key, it.Value)
}

支持分片的多服务器连接

gomemcached支持自动分片到多个Memcached服务器:

func main() {
	// 创建分片客户端,连接到多个Memcached服务器
	mc := memcache.New("10.0.0.1:11211", "10.0.0.2:11211", "10.0.0.3:11211")
	
	// 设置键值对 - 会自动根据key的hash选择服务器
	item := &memcache.Item{
		Key:   "user:1001",
		Value: []byte(`{"name":"John","age":30}`),
	}
	err := mc.Set(item)
	if err != nil {
		log.Fatal(err)
	}

	// 批量获取多个键
	keys := []string{"user:1001", "user:1002"}
	items, err := mc.GetMulti(keys)
	if err != nil {
		log.Fatal(err)
	}
	for k, v := range items {
		fmt.Printf("Key: %s, Value: %s\n", k, v.Value)
	}
}

支持SASL认证

对于需要SASL认证的Memcached服务器(如AWS ElastiCache),可以使用以下方式:

package main

import (
	"fmt"
	"log"

	"github.com/bradfitz/gomemcache/memcache"
)

func main() {
	// 创建客户端
	mc := memcache.New("your-memcached-endpoint:11211")
	
	// 设置SASL认证信息
	mc.SetAuth("username", "password")
	
	// 测试连接
	err := mc.Ping()
	if err != nil {
		log.Fatal("Ping failed:", err)
	}

	// 正常操作
	item := &memcache.Item{
		Key:   "test",
		Value: []byte("value"),
	}
	err = mc.Set(item)
	if err != nil {
		log.Fatal(err)
	}

	it, err := mc.Get("test")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Got value: %s\n", it.Value)
}

高级配置

func main() {
	// 创建自定义配置的客户端
	mc := memcache.New("server1:11211", "server2:11211")
	
	// 设置超时
	mc.Timeout = 5 * time.Second
	
	// 设置最大空闲连接数
	mc.MaxIdleConns = 10
	
	// 启用连接池
	mc.SetPoolSize(20)
	
	// 设置重试次数
	mc.MaxRetries = 3
	
	// 使用自定义的hash函数
	mc.SetHashFunc(func(key string) uint32 {
		// 自定义hash逻辑
		return crc32.ChecksumIEEE([]byte(key))
	})
}

错误处理最佳实践

func getFromCache(mc *memcache.Client, key string) ([]byte, error) {
	item, err := mc.Get(key)
	if err != nil {
		if err == memcache.ErrCacheMiss {
			// 缓存未命中是正常情况,不是错误
			return nil, nil
		}
		// 其他错误需要处理
		return nil, fmt.Errorf("memcache error: %v", err)
	}
	return item.Value, nil
}

性能优化建议

  1. 使用连接池并合理设置池大小
  2. 批量操作使用GetMulti代替多次Get
  3. 对于热点数据,考虑使用本地缓存+Memcached的多级缓存
  4. 合理设置过期时间,避免缓存雪崩

gomemcached库提供了丰富的功能来满足大多数Memcached使用场景,包括分片、SASL认证和连接池等高级特性。根据你的具体需求选择合适的配置即可。

回到顶部