2017-12-29 13 views
-1

私自身のhttpcacheを書き込もうとしています。私はそれを間違った方法をやっている疑いがあるが、これは私のアプローチです:httpリクエストをキャッシュするためのdiskv valueフィールド(期待される[]バイト)のmap [string] interface {}データを格納

私の応答は次のようになります。

response := make(map[string]interface{}) 
w.WriteHeader(http.StatusOK) 
response["status"] = true 
response["token"] = someTokenString 
response["data"] = someStructSlice // etc 
json.NewEncoder(w).Encode(response) 

私の計画は今、私はURLパスと同じキーに設定どこhttps://github.com/peterbourgon/diskvを使用することです( +必要に応じてユーザー名/トークン)。そして、値を応答データと同じにします。

問題このデータをどのように保存するべきかわかりません。 dickvはデータタイプが[]byteであると予想していますが、私の応答データはタイプmap[string]interface {}です。

どのように変換するかを理解しようとする前に、正しいアプローチ。そしてもし私がいれば、responseをdickv値(タイプ[]byte)に保存する簡単な方法はありますか?

+2

まあ、あなたは既にJSONにエンコードしています。これは '[] byte'として出力されます。あなたはそれを保存することができます。さらに、すべてのキャッシュヒットでデコード/エンコードする必要がなく、キャッシュからまっすぐにデータを提供するという利点があります。また、組み込みの '' gob'パッケージ(https://golang.org/pkg/encoding/gob/)を使うこともできます。 – Adrian

+0

'respond'は' encodedJson、err:= json.Marshal(response) 'を使ってエンコードする必要がありますか? 'w.Write(encodedJson)'? – fisker

+0

修正します。その後、キャッシュに同じペイロードを書き込むことができます。 – Adrian

答えて

1

まあ、すでにJSONにエンコードしています。これは[]バイトとして出力されます。あなたはそれを保存することができます。プラスあなただけのストレートキャッシュからデータを提供し、すべてのキャッシュヒットに/エンコードをデコードする必要がないというメリットを得る:

if cached, ok := getFromCache(id); ok { 
    response.Write(cached) 
    return 
} 
response["status"] = true 
response["token"] = someTokenString 
response["data"] = someStructSlice // etc 
payload, err := json.Marshall(response) 
saveToCache(payload, id) 
response.Write(payload) 

あなたはまた、より効率的でより多くのである、ビルトインgob packageを使用することができますデータモデルが変更された場合に破損しやすくなります。

+0

ありがとうございます<3 – fisker

関連する問題