golang支持分片和SASL认证的Memcached二进制客户端插件库gomemcached的使用
Golang支持分片和SASL认证的Memcached二进制客户端插件库gomemcached的使用
简介
Gomemcached是一个Golang Memcached客户端,设计用于与多个实例作为分片进行交互。使用一致性哈希实现分片。
配置
使用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许可证管辖:
-
gomemcache
- 描述: 一个用于memcached服务器的Go客户端库
- 用途: 与库交互的主要客户端方法
- 许可证: Apache License 2.0
-
go-zero
- 描述: 一个云原生Go微服务框架,带有提高生产力的CLI工具
- 用途: 一致性哈希的实现
- 许可证: MIT License
-
gomemcached
- 描述: 一个用于go的memcached二进制协议工具包
- 用途: Memcached二进制客户端的实现
- 许可证: MIT License
更多关于golang支持分片和SASL认证的Memcached二进制客户端插件库gomemcached的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于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
}
性能优化建议
- 使用连接池并合理设置池大小
- 批量操作使用GetMulti代替多次Get
- 对于热点数据,考虑使用本地缓存+Memcached的多级缓存
- 合理设置过期时间,避免缓存雪崩
gomemcached库提供了丰富的功能来满足大多数Memcached使用场景,包括分片、SASL认证和连接池等高级特性。根据你的具体需求选择合适的配置即可。