內存鍵值存儲效率,我想知道是否有golang任何包,將有到期,高效如何實現在golang
我查了幾個,下面是them之一,但從實施透視它鎖定整個緩存寫入一個條目(檢查this)這是不需要的權利?
是否可以鎖定一個條目而不是鎖定整個緩存?
內存鍵值存儲效率,我想知道是否有golang任何包,將有到期,高效如何實現在golang
我查了幾個,下面是them之一,但從實施透視它鎖定整個緩存寫入一個條目(檢查this)這是不需要的權利?
是否可以鎖定一個條目而不是鎖定整個緩存?
要鎖定一個條目並不容易,但您想要更高效,Go中的一個好習慣是使用通道與順序流程進行通信。這樣,就沒有共享變量和鎖。
的一個簡單的例子:
type request struct {
reqtype string
key string
val interface{}
response chan<- result
}
type result struct {
value interface{}
err error
}
type Cache struct{ requests chan request }
func New() *Cache {
cache := &Cache{requests: make(chan request)}
go cache.server()
return cache
}
func (c *Cache) Get(key string) (interface{}, error) {
response := make(chan result)
c.requests <- request{key, response}
res := <-response
return res.value, res.err
}
func (c *Cache) Set(key, val string) {
c.requests <- request{"SET", key, val, response}
}
func (c *Cache) server() {
cache := make(map[string]interface{})
for req := range memo.requests {
switch req.reqtype {
case "SET":
cache[req.key] = req.val
case "GET":
e := cache[req.key]
if e == nil {
req.response <- result{e, errors.New("not exist")}
} else {
req.response <- result{e, nil}
}
}
}
}
不要自吹自擂,但我寫了[cmap](https://github.com/OneOfOne/cmap)來解決這個問題。 – OneOfOne
實現的分解方式看起來不錯。但我想要的密鑰也有失效,這在cmap中是不存在的 – Raghu