golang高性能Memcached客户端插件库gomemcache的使用
golang高性能Memcached客户端插件库gomemcache的使用
关于
这是一个用于Go编程语言的memcache客户端库。
安装
使用以下命令安装:
$ go get github.com/bradfitz/gomemcache/memcache
使用示例
下面是一个完整的示例demo,展示如何使用gomemcache库:
package main
import (
"fmt"
"log"
"github.com/bradfitz/gomemcache/memcache"
)
func main() {
// 初始化Memcached客户端,可以传入多个服务器地址
mc := memcache.New("10.0.0.1:11211", "10.0.0.2:11211", "10.0.0.3:11212")
// 设置一个键值对
err := mc.Set(&memcache.Item{
Key: "foo", // 键名
Value: []byte("my value"), // 值
Expiration: 3600, // 过期时间(秒)
})
if err != nil {
log.Fatalf("设置值失败: %v", err)
}
// 获取值
it, err := mc.Get("foo")
if err != nil {
log.Fatalf("获取值失败: %v", err)
}
// 打印获取到的值
fmt.Printf("键: %s, 值: %s\n", it.Key, string(it.Value))
// 删除键
err = mc.Delete("foo")
if err != nil {
log.Fatalf("删除键失败: %v", err)
}
// 检查键是否已删除
_, err = mc.Get("foo")
if err == memcache.ErrCacheMiss {
fmt.Println("键已成功删除")
} else if err != nil {
log.Fatalf("检查键失败: %v", err)
} else {
fmt.Println("键仍然存在")
}
}
完整文档
要查看完整的文档,可以运行:
$ godoc github.com/bradfitz/gomemcache/memcache
更多关于golang高性能Memcached客户端插件库gomemcache的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang高性能Memcached客户端插件库gomemcache的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go语言高性能Memcached客户端:gomemcache使用指南
gomemcache是Go语言的一个高性能Memcached客户端库,它提供了简单易用的API来与Memcached服务器交互。下面我将详细介绍如何使用gomemcache库。
安装gomemcache
首先需要安装gomemcache库:
go get github.com/bradfitz/gomemcache/memcache
基本使用
1. 创建客户端
package main
import (
"fmt"
"log"
"time"
"github.com/bradfitz/gomemcache/memcache"
)
func main() {
// 创建Memcached客户端,可以指定多个服务器地址
mc := memcache.New("127.0.0.1:11211", "127.0.0.1:11212")
// 设置超时时间
mc.Timeout = 5 * time.Second
// 设置最大空闲连接数
mc.MaxIdleConns = 100
}
2. 基本操作
// 设置键值对
func setValue(mc *memcache.Client, key, value string, expiration int32) error {
item := &memcache.Item{
Key: key,
Value: []byte(value),
Expiration: expiration, // 过期时间(秒)
}
return mc.Set(item)
}
// 获取值
func getValue(mc *memcache.Client, key string) (string, error) {
item, err := mc.Get(key)
if err != nil {
return "", err
}
return string(item.Value), nil
}
// 删除键
func deleteKey(mc *memcache.Client, key string) error {
return mc.Delete(key)
}
// 示例使用
func exampleUsage() {
mc := memcache.New("127.0.0.1:11211")
// 设置值
err := setValue(mc, "foo", "bar", 3600)
if err != nil {
log.Fatal(err)
}
// 获取值
val, err := getValue(mc, "foo")
if err != nil {
log.Fatal(err)
}
fmt.Println("Got value:", val)
// 删除值
err = deleteKey(mc, "foo")
if err != nil {
log.Fatal(err)
}
}
高级特性
1. 批量操作
// 批量获取
func batchGet(mc *memcache.Client, keys []string) {
items, err := mc.GetMulti(keys)
if err != nil {
log.Fatal(err)
}
for key, item := range items {
fmt.Printf("Key: %s, Value: %s\n", key, string(item.Value))
}
}
// 示例
func batchExample() {
mc := memcache.New("127.0.0.1:11211")
// 设置多个值
mc.Set(&memcache.Item{Key: "k1", Value: []byte("v1"), Expiration: 3600})
mc.Set(&memcache.Item{Key: "k2", Value: []byte("v2"), Expiration: 3600})
mc.Set(&memcache.Item{Key: "k3", Value: []byte("v3"), Expiration: 3600})
// 批量获取
batchGet(mc, []string{"k1", "k2", "k3", "nonexistent"})
}
2. 原子操作
// 原子递增/递减
func atomicIncrement(mc *memcache.Client, key string) {
// 如果key不存在,delta将作为初始值
newValue, err := mc.Increment(key, 1)
if err != nil {
log.Fatal(err)
}
fmt.Println("New value after increment:", newValue)
// 递减
newValue, err = mc.Decrement(key, 1)
if err != nil {
log.Fatal(err)
}
fmt.Println("New value after decrement:", newValue)
}
3. 连接池配置
func configurePool() {
mc := memcache.New("127.0.0.1:11211")
// 配置连接池
mc.MaxIdleConns = 100 // 最大空闲连接数
mc.Timeout = 1 * time.Second // 超时时间
}
错误处理
gomemcache返回的错误类型可以用于判断错误原因:
func handleErrors(mc *memcache.Client) {
_, err := mc.Get("nonexistent_key")
if err != nil {
if err == memcache.ErrCacheMiss {
fmt.Println("Key not found in cache")
} else {
fmt.Println("Error:", err)
}
}
}
性能优化建议
- 使用连接池:合理配置MaxIdleConns参数
- 批量操作:尽可能使用GetMulti代替多次Get
- 合理设置超时:根据网络环境设置适当的Timeout
- 键值大小:Memcached单个item限制通常为1MB,避免大value
- 错误处理:适当处理错误,避免频繁重试
完整示例
package main
import (
"fmt"
"log"
"time"
"github.com/bradfitz/gomemcache/memcache"
)
func main() {
// 初始化客户端
mc := memcache.New("127.0.0.1:11211")
mc.Timeout = 3 * time.Second
mc.MaxIdleConns = 50
// 设置值
err := mc.Set(&memcache.Item{
Key: "username",
Value: []byte("john_doe"),
Expiration: 3600,
})
if err != nil {
log.Fatal("Set failed:", err)
}
// 获取值
item, err := mc.Get("username")
if err != nil {
log.Fatal("Get failed:", err)
}
fmt.Printf("Got username: %s\n", string(item.Value))
// 原子递增
mc.Set(&memcache.Item{Key: "counter", Value: []byte("42"), Expiration: 0})
newVal, err := mc.Increment("counter", 8)
if err != nil {
log.Fatal("Increment failed:", err)
}
fmt.Println("Counter after increment:", newVal)
// 批量获取
mc.Set(&memcache.Item{Key: "k1", Value: []byte("v1")})
mc.Set(&memcache.Item{Key: "k2", Value: []byte("v2")})
items, err := mc.GetMulti([]string{"k1", "k2", "nonexistent"})
if err != nil {
log.Fatal("GetMulti failed:", err)
}
for k, v := range items {
fmt.Printf("Key: %s, Value: %s\n", k, string(v.Value))
}
// 删除
err = mc.Delete("username")
if err != nil {
log.Fatal("Delete failed:", err)
}
}
gomemcache是一个简单高效的Memcached客户端,适合大多数Go语言项目中使用Memcached作为缓存的场景。通过合理配置和正确使用API,可以充分发挥Memcached的高性能特性。