123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- package dbserver
- import (
- "sync"
- "time"
- )
- //实现一个缓存存列表
- //可以添加、删除元素、不存在时添加
- //添加:列表中不存在时添加,存在时替换
- //删除列表:按照添加时的顺序删除元素
- type saveItem struct {
- val interface{}
- tick int64
- }
- type CacheSaveList struct {
- sync.Mutex
- allItem map[string]*saveItem
- orderItem []string
- pool sync.Pool
- }
- func NewCacheList() *CacheSaveList {
- l := new(CacheSaveList)
- l.orderItem = make([]string, 0)
- l.allItem = make(map[string]*saveItem)
- l.pool.New = func() interface{} {
- return new(saveItem)
- }
- return l
- }
- func (l *CacheSaveList) newSaveItem(val interface{}) *saveItem {
- it := l.pool.Get()
- it1 := it.(*saveItem)
- it1.val = val
- it1.tick = time.Now().Unix()
- return it1
- }
- func (l *CacheSaveList) Add(key string, val interface{}) int {
- l.Lock()
- defer l.Unlock()
- if v, ok := l.allItem[key]; !ok {
- l.orderItem = append(l.orderItem, key)
- it1 := l.newSaveItem(val)
- l.allItem[key] = it1
- } else {
- v.val = val
- }
- return len(l.orderItem)
- }
- //列表中不存在时添加,
- func (l *CacheSaveList) Addnx(key string, val interface{}) {
- l.Lock()
- defer l.Unlock()
- if _, ok := l.allItem[key]; !ok {
- l.orderItem = append(l.orderItem, key)
- it1 := l.newSaveItem(val)
- l.allItem[key] = it1
- }
- }
- func (l *CacheSaveList) Pop() interface{} {
- l.Lock()
- defer l.Unlock()
- if len(l.orderItem) == 0 {
- // if len(l.allItem) > 0 {
- // l.allItem = make(map[int64]interface{})
- // }
- return nil
- }
- k := l.orderItem[0]
- l.orderItem = l.orderItem[1:]
- if v, ok := l.allItem[k]; ok {
- delete(l.allItem, k)
- v2 := v.val
- v.val = nil
- l.pool.Put(v)
- return v2
- }
- return nil
- }
- func (l *CacheSaveList) GetHeadTick() int64 {
- l.Lock()
- defer l.Unlock()
- if len(l.orderItem) == 0 {
- return 0
- }
- k := l.orderItem[0]
- if v, ok := l.allItem[k]; ok {
- return v.tick
- }
- //不应该会执行到这里
- l.orderItem = l.orderItem[1:]
- return 0
- }
- func (l *CacheSaveList) Count() int {
- return len(l.orderItem)
- }
- //缓存读列表
- //可以添加、删除、查找元素、超时删除
- //查找:存在时返回值,不存在时返回空;
- //超时删除:添加的元素,保存一段时间后删除
- //添加:加入列表,设置时间戳
|