私はメモリキャッシュとチャネルとして同期マップを使用して同期アクセスを保証しています。マップを同期させるためにチャネルを使用するより良い方法はありますか?
私の「セッション」のパッケージには、キャッシュを定義していますマップ[文字列] * SessionDataに
SessionDataには、コードに見られるように、他のアクセス機能と一緒に、またパッケージで定義された構造体です。
GetWebPage(rw http.ResponseWriter, req *http.Request) {
var sd *session.SessionData
var sessTkn string
cookie, err := req.Cookie("sesstoken")
if err == nil { // cookie found
sessTkn = cookie.Value
// Check for cache entry for this token,
// using a channel to protect the map and return
// a pointer to the cached data if it exists
sdc := make(chan *session.SessionData, 1)
go session.GetSessionFromCache(sessTkn, sdc)
sd = <-sdc
if sd == nil { // sessTkn not in the cache
// This is test data to simplify example
sv := make([]string, 4)
sv[0] = sessTkn
iv := make([]int, 3)
iv[0] = 100
iv[1] = 1000
sdc := make(chan *session.SessionData, 1)
go session.NewSessionData(sv, iv, false, false, sdc)
session.SC[sessTkn] = <-sdc
}
// Is this necessary? Is there a better way?
// ---------------------------------------
if sd == nil {
sdc = make(chan *session.SessionData, 1)
go session.GetSessionFromCache(sessTkn, sdc)
sd = <-sdc
}
// ---------------------------------------
fmt.Println(sd) // just to prove that it works in both cases
}
// The rest of the handler code follows
同期に使用できるアクセス[移動中セマフォパッケージ]の提案について(https://github.com/kamilsk/semaphore) –
@Hamza感謝を確保するために。私の場合、汎用セマフォは通信能力を犠牲にします(チャネル上で型付きデータを送受信します)。望ましい副作用として、チャネルはマップへのアクセスをブロックし、非同期アクセスを保証します。いずれのアクセス機能も「重労働」とはみなされません。コードは機能しています。私の唯一の関心事は、新しいエントリがマップに追加されたことを確認するために必要な繰り返しです。 – emadera52