Example #1
0
func Counter(w http.ResponseWriter, r *http.Request) {
	c := appengine.NewContext(r)

	// 未設定の場合は第4引数の値で初期化する
	// memcache.IncrementExistingは未設定だとエラーになる
	if newValue, err := memcache.Increment(c, "inc", 1, 0); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
	} else {
		fmt.Fprintf(w, "newValue = %d\n", newValue)
	}

	if stats, err := memcache.Stats(c); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
	} else {
		// キャッシュヒットとなる要求の回数
		fmt.Fprintf(w, "Hits = %d\n", stats.Hits)
		// キャッシュミスとなる要求の回数
		fmt.Fprintf(w, "Misses = %d\n", stats.Misses)
		// 取得要求時の総データ転送量
		fmt.Fprintf(w, "ByteHits = %d\n", stats.ByteHits)
		// キャッシュに保存されているキーと値のペア数
		fmt.Fprintf(w, "Items = %d\n", stats.Items)
		// キャッシュ内のすべてのアイテムの合計サイズ
		fmt.Fprintf(w, "Bytes = %d\n", stats.Bytes)
		// キャッシュ内の一番古いアイテムにアクセスされた時からの秒数
		fmt.Fprintf(w, "Oldest = %d\n", stats.Oldest)
	}
}
Example #2
0
func (ctl contextTemplateLoader) LoadTemplate(name string) (Template, error) {
	c := ctl.Context

	var c_temp ctlTemplate

	// check the memcache
	if _, err := memcache.Gob.Get(c, name, &c_temp); err == nil {
		return fromCtlTemplate(c_temp), nil
	} else if err != memcache.ErrCacheMiss {
		return Template{}, err // if encounter any error but cache miss return the failure
	}

	//  read the value from the datastore
	if err := datastore.Get(c, datastore.NewKey(c, "Name", name, 0, nil), &c_temp); err != nil {
		return Template{}, err
	}

	const max_cache_size = 20 * Mebi
	const min_cache_time = 20 // in seconds

	// if the oldest item in the cache is too young,
	if stats, err := memcache.Stats(c); err != nil {
		log.Println(err)
	} else if stats == nil || stats.Bytes < max_cache_size || stats.Oldest > min_cache_time {
		// cache the value from the datastore if we're under the max size or the oldest item is over the min time
		err := memcache.Gob.Set(c, &memcache.Item{Key: name, Object: &c_temp, Expiration: 1 * time.Hour})
		log.Println(err)
	}
	return fromCtlTemplate(c_temp), nil
}
Example #3
0
func memcacheHandler(w http.ResponseWriter, r *http.Request) {
	c := appengine.NewContext(r)
	w.Header().Set("Content-Type", "application/json")

	stats, err := memcache.Stats(c)
	if err != nil {
		writeJSON(w, map[string]string{"error": err.String()})
		return
	}
	writeJSON(w, stats)
}
Example #4
0
// Count returns the total number of items in the store.
func (s *Store) Count(c appengine.Context) int64 {
	stats, _ := aemc.Stats(c)
	return int64(stats.Items)
}