1

Go に比較的慣れていないので、何かばかげたことをしているのか (かなりの可能性が高い)、それともバグがあるのか​​ (おそらくばかげたことをしている可能性は低い) はわかりません。Beego のファイルシステム キャッシュを使用して 2 つのファイルシステム キャッシュがあります。これらは 2 つの別個のフォルダーです。各キャッシュに書き込もうとすると、結果が混乱する値を取得しようとします。MyCache の作成は、Init() 関数で OtherCache によってオーバーライドされることがわかります。

package main

import (
    "github.com/astaxie/beego/cache"
    "log"
)

var (
    MyCache    cache.Cache
    OtherCache cache.Cache
    err        error
)

func Init() {
    if MyCache, err = cache.NewCache("file", `{"CachePath":".cache/mycache","FileSuffix":".cache","DirectoryLevel":1,"EmbedExpiry":10}`); err != nil {
        log.Println(err)
    }
    if OtherCache, err = cache.NewCache("file", `{"CachePath":".cache/othercache","FileSuffix":".cache","DirectoryLevel":1,"EmbedExpiry":10}`); err != nil {
        log.Println(err)
    }
}
func checkCache(c cache.Cache, k string) string {
    b := c.Get(k)
    return b.(string)
}
func writeCache(c cache.Cache, k string, v string) {
    if err := c.Put(k, v, 10); err != nil {
        log.Println(err)
    }
}
func main() {
    log.SetFlags(log.Lshortfile)
    Init()
    log.Println(MyCache)
    log.Println(OtherCache)
    // write to MyCache
    mykey := "mykey"
    myvalue := "myvalue"
    writeCache(MyCache, mykey, myvalue)

    // write to OtherCache
    othervalue := "othervalue"
    writeCache(OtherCache, mykey, othervalue)

    // Get MyCache value
    myv := checkCache(MyCache, mykey)
    log.Println("MyCache:", myv, myv == myvalue)

    // Get OtherCache value
    otherv := checkCache(OtherCache, mykey)
    log.Println("OtherCache:", otherv, otherv == othervalue)
}

結果:

tester.go:34: &{/home/desktop-admin/Desktop/eclipse/go/src/testfolder/tester/.cache/othercache .cache 2 0}
tester.go:35: &{/home/desktop-admin/Desktop/eclipse/go/src/testfolder/tester/.cache/othercache .cache 2 0}
tester.go:47: MyCache: othervalue false
tester.go:51: OtherCache: othervalue true

この出力の最初の行は、「othercache」ではなく「mycache」を指している必要があります。また、この出力の 3 行目は間違っています...値は「othervalue」ではなく「myvalue」である必要があります。

ここで何か間違ったことをしていますか?(私の他のオプションは、1つのファイルシステムキャッシュを作成してキーを変更することですが、2つの異なるフォルダーを管理し、必要に応じてキャッシュ全体を簡単に削除する方がはるかに簡単です....ここで何が間違っているのか知りたいです。でも)

4

1 に答える 1

0

NewCache 関数の実装を見てください。

https://github.com/astaxie/beego/blob/master/cache/cache.go#L84

このパッケージでは、アダプターごとに 1 つのキャッシュのみが許可されます。同じアダプターに対する NewCache への 2 回目の呼び出しは、再構成され、同じオブジェクトを返します。

于 2014-12-05T21:23:57.630 に答える