之於
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)
}