实现内存缓存

This commit is contained in:
GoEdgeLab
2020-10-05 19:15:35 +08:00
parent 870876bfff
commit 9c0c772226
14 changed files with 504 additions and 17 deletions

View File

@@ -0,0 +1,83 @@
package caches
import (
"github.com/dchest/siphash"
"sync"
)
type MemoryWriter struct {
key string
expiredAt int64
m map[uint64]*MemoryItem
locker *sync.RWMutex
isFirstWriting bool
size int64
}
func NewMemoryWriter(m map[uint64]*MemoryItem, key string, expiredAt int64, locker *sync.RWMutex) *MemoryWriter {
return &MemoryWriter{
m: m,
key: key,
expiredAt: expiredAt,
locker: locker,
isFirstWriting: true,
}
}
// 写入数据
func (this *MemoryWriter) Write(data []byte) (n int, err error) {
this.size += int64(len(data))
hash := this.hash(this.key)
this.locker.Lock()
item, ok := this.m[hash]
if ok {
// 第一次写先清空
if this.isFirstWriting {
item.Value = nil
this.isFirstWriting = false
}
item.Value = append(item.Value, data...)
} else {
item := &MemoryItem{}
item.Value = append([]byte{}, data...)
item.ExpiredAt = this.expiredAt
this.m[hash] = item
}
this.locker.Unlock()
return len(data), nil
}
// 数据尺寸
func (this *MemoryWriter) Size() int64 {
return this.size
}
// 关闭
func (this *MemoryWriter) Close() error {
return nil
}
// 丢弃
func (this *MemoryWriter) Discard() error {
hash := this.hash(this.key)
this.locker.Lock()
delete(this.m, hash)
this.locker.Unlock()
return nil
}
// Key
func (this *MemoryWriter) Key() string {
return this.key
}
// 过期时间
func (this *MemoryWriter) ExpiredAt() int64 {
return this.expiredAt
}
// 计算Key Hash
func (this *MemoryWriter) hash(key string) uint64 {
return siphash.Hash(0, 0, []byte(key))
}