forked from p93542168/wheat-cache
fix(lru): fix the bug of lru
This commit is contained in:
parent
ca04ba1686
commit
477adec1bb
|
@ -5,8 +5,8 @@ import "sync"
|
||||||
type SingleWorkFunc func() interface{}
|
type SingleWorkFunc func() interface{}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
OpEventName = "operateEvent"
|
OptionEventName = "operateEvent"
|
||||||
CleEventName = "clearEvent"
|
CleanEventName = "clearEvent"
|
||||||
WorkFuncEventKey = "workFunc"
|
WorkFuncEventKey = "workFunc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -14,3 +14,9 @@ var (
|
||||||
lruCacheOnce sync.Once
|
lruCacheOnce sync.Once
|
||||||
lruCache *singleCache
|
lruCache *singleCache
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
lruMaxSize = 1*1024*1024*1024*8
|
||||||
|
lruClearSize = 0.5*1024*1024*1024*8
|
||||||
|
lruEventDriver = 2000
|
||||||
|
)
|
||||||
|
|
|
@ -2,7 +2,6 @@ package lru
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"container/list"
|
"container/list"
|
||||||
"fmt"
|
|
||||||
_ "gitee.com/timedb/wheatCache/conf"
|
_ "gitee.com/timedb/wheatCache/conf"
|
||||||
"gitee.com/timedb/wheatCache/pkg/errorx"
|
"gitee.com/timedb/wheatCache/pkg/errorx"
|
||||||
"gitee.com/timedb/wheatCache/pkg/event"
|
"gitee.com/timedb/wheatCache/pkg/event"
|
||||||
|
@ -26,40 +25,55 @@ type singleCache struct {
|
||||||
|
|
||||||
lruDriver event.DriverInterface
|
lruDriver event.DriverInterface
|
||||||
lruConsumer event.ConsumerInterface
|
lruConsumer event.ConsumerInterface
|
||||||
lruProduce event.ProduceInterface // 发送清理事件
|
lruCleanProduce event.ProduceInterface // 发送清理事件
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateLruLength 更新现在的长度
|
// UpdateLruSize 更新现在的长度
|
||||||
func (lru *singleCache) UpdateLruLength(length int64) {
|
func (lru *singleCache) UpdateLruSize(length int64) {
|
||||||
atomic.AddInt64(&lru.nowSize, length)
|
atomic.AddInt64(&lru.nowSize, length)
|
||||||
}
|
}
|
||||||
|
|
||||||
func cacheInit() (string, string, event.DriverInterface) {
|
func cacheInit() (int64, int64, event.DriverInterface) {
|
||||||
viper.Set("lruCache.maxSize", "1GB")
|
|
||||||
viper.Set("lruCache.clearSize", "512MB")
|
|
||||||
viper.Set("lruCache.eventDriverSize", 2000)
|
|
||||||
maxSize := viper.GetString("lruCache.maxSize")
|
maxSize := viper.GetString("lruCache.maxSize")
|
||||||
|
retMaxSize, maxErr:= util.ParseSizeToBit(maxSize)
|
||||||
|
if maxErr != nil{
|
||||||
|
return 0, 0, nil
|
||||||
|
}
|
||||||
|
if retMaxSize == 0{
|
||||||
|
retMaxSize = lruMaxSize
|
||||||
|
}
|
||||||
|
|
||||||
clearSize := viper.GetString("lruCache.clearSize")
|
clearSize := viper.GetString("lruCache.clearSize")
|
||||||
|
retClearSize, clearErr := util.ParseSizeToBit(clearSize)
|
||||||
|
if clearErr != nil{
|
||||||
|
return 0, 0, nil
|
||||||
|
}
|
||||||
|
if retClearSize == 0{
|
||||||
|
retClearSize = lruClearSize
|
||||||
|
}
|
||||||
|
|
||||||
maxDriver := viper.GetInt("lruCache.eventDriverSize")
|
maxDriver := viper.GetInt("lruCache.eventDriverSize")
|
||||||
|
if maxDriver == 0{
|
||||||
|
maxDriver = lruEventDriver
|
||||||
|
}
|
||||||
lruDriver := event.NewDriver(maxDriver)
|
lruDriver := event.NewDriver(maxDriver)
|
||||||
fmt.Println(clearSize)
|
return retMaxSize, retClearSize, lruDriver
|
||||||
return maxSize, clearSize, lruDriver
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLRUCache lru初始化
|
// NewLRUCache lru初始化
|
||||||
func NewLRUCache() *singleCache {
|
func NewLRUCache() *singleCache {
|
||||||
|
maxSize, clearSize, lruDrivers := cacheInit()
|
||||||
lruCacheOnce.Do(func() {
|
lruCacheOnce.Do(func() {
|
||||||
maxSize, clearSize, lruDriver := cacheInit()
|
_, _, lruDriver := cacheInit()
|
||||||
lru := &singleCache{
|
lru := &singleCache{
|
||||||
maxsize: util.ParseSizeToBit(maxSize).(int64),
|
maxsize: maxSize,
|
||||||
clearSize: util.ParseSizeToBit(clearSize).(int64),
|
clearSize: clearSize,
|
||||||
nowSize: 0,
|
nowSize: 0,
|
||||||
li: list.New(),
|
li: list.New(),
|
||||||
lruMap: make(map[string]*list.Element),
|
lruMap: make(map[string]*list.Element),
|
||||||
lruDriver: lruDriver,
|
lruDriver: lruDriver,
|
||||||
lruConsumer: event.NewConsumer(lruDriver),
|
lruConsumer: event.NewConsumer(lruDrivers),
|
||||||
lruProduce: event.NewProduce(lruDriver),
|
lruCleanProduce: event.NewProduce(lruDrivers),
|
||||||
}
|
}
|
||||||
lruCache = lru
|
lruCache = lru
|
||||||
go lru.lruSingleWork()
|
go lru.lruSingleWork()
|
||||||
|
@ -86,6 +100,8 @@ func (lru *singleCache) Add(key string, val structure.KeyBaseInterface) {
|
||||||
}
|
}
|
||||||
valEl := lru.li.PushFront(keyBaseVal)
|
valEl := lru.li.PushFront(keyBaseVal)
|
||||||
lru.lruMap[key] = valEl
|
lru.lruMap[key] = valEl
|
||||||
|
//增加大小
|
||||||
|
lru.UpdateLruSize(valEl.Value.(*keyBaseValue).val.SizeByte())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get 查找key对应的value
|
// Get 查找key对应的value
|
||||||
|
@ -108,6 +124,8 @@ func (lru *singleCache) Del() error {
|
||||||
}
|
}
|
||||||
data := lru.li.Back()
|
data := lru.li.Back()
|
||||||
delete(lru.lruMap, data.Value.(*keyBaseValue).key)
|
delete(lru.lruMap, data.Value.(*keyBaseValue).key)
|
||||||
|
//删除大小
|
||||||
|
lru.UpdateLruSize(-1 * data.Value.(*keyBaseValue).val.SizeByte())
|
||||||
lru.li.Remove(data)
|
lru.li.Remove(data)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package lru
|
package lru
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"gitee.com/timedb/wheatCache/pkg/structure/stringx"
|
"gitee.com/timedb/wheatCache/pkg/structure/stringx"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -15,7 +16,9 @@ func TestNewLRUCache(t *testing.T) {
|
||||||
cache.Add("2", v2)
|
cache.Add("2", v2)
|
||||||
cache.Add("3", v3)
|
cache.Add("3", v3)
|
||||||
cache.Add("1", v1)
|
cache.Add("1", v1)
|
||||||
|
fmt.Println(cache.nowSize)
|
||||||
cache.Del()
|
cache.Del()
|
||||||
|
fmt.Println(cache.nowSize)
|
||||||
_, isTrue := cache.Get("1")
|
_, isTrue := cache.Get("1")
|
||||||
require.Equal(t, isTrue, true)
|
require.Equal(t, isTrue, true)
|
||||||
}
|
}
|
Loading…
Reference in New Issue