Go 中使用 memcache 存储对象
之于
B/S
端用http
连接,像mysql,redis,memcache
这种服务端之间的交流,通常直接采用TCP通信。而对于缓存的内存存储,过期时间是必备,进行必要的对象序列化编码也不可缺。本文用memcache存储,采用标准库中的json编解码,当然你也可用gob。
memcache
- 安装服务端memcache
- 引入相关go客户端
对象序列化
标准库json编解码直接拿来用,省心
func DecodeData(raw []byte) (dog Dog, err error) {
err = json.Unmarshal(raw, &dog)
return dog, err
}
func EncodeData(dog Dog) []byte {
enc, err := json.Marshal(dog)
if err != nil {
fmt.Println("Error encoding Action to JSON", err)
}
return enc
}
缓存命中
- 建立连接
- 缓存命中检查
- 构建缓存实例
func main() {
// 连接服务
mc := memcache.New("127.0.0.1:11211")
// 尝试拉取缓存
fetchItem, err := mc.Get("dog")
// 检查缓存是否命中
if err != memcache.ErrCacheMiss {
if err != nil {
fmt.Println("Error fetching from memcache", err)
} else {
fmt.Println("Cache hit!")
dog, err := DecodeData(fetchItem.Value)
if err != nil {
fmt.Println("Error decoding data from memcache", err)
} else {
fmt.Println("Dog name is:", dog.Name)
}
}
}
// 创建待缓存对象实例
spot := Dog{Name: "Spot", Color: "brown"}
// 构建memcache item实例以备入库
setItem := memcache.Item{
Key: "dog",
Value: EncodeData(spot),
Expiration: 300,
}
// 进入内存缓存
err = mc.Set(&setItem)
if err != nil {
fmt.Println("Error setting memcache item", err)
}
测试
本作品采用《CC 协议》,转载必须注明作者和本文链接