Go 中使用 memcache 儲存物件

pardon110發表於2019-11-26

之於B/S端用http連線,像mysql,redis,memcache 這種服務端之間的交流,通常直接採用TCP通訊。而對於快取的記憶體儲存,過期時間是必備,進行必要的物件序列化編碼也不可缺。本文用memcache儲存,採用標準庫中的json編解碼,當然你也可用gob。

memcache

  • 安裝服務端memcache
  • 引入相關go客戶端

Go中使用memcache儲存物件

物件序列化

標準庫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)
     }

測試

Go 中使用 memcache 儲存物件

相關文章