67 lines
1.2 KiB
Go
67 lines
1.2 KiB
Go
|
package httplib
|
|||
|
|
|||
|
// 这个暂时用不到
|
|||
|
|
|||
|
import (
|
|||
|
"sync"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
// DeadCache 死掉的实例缓存
|
|||
|
type DeadCache struct {
|
|||
|
sync.RWMutex
|
|||
|
Data map[string]int64
|
|||
|
Duration time.Duration
|
|||
|
}
|
|||
|
|
|||
|
// NewDeadCache 实例化DeadCache,每个HTTPServer只对应一个DeadCache
|
|||
|
func NewDeadCache(duration time.Duration) DeadCache {
|
|||
|
deadCache := DeadCache{
|
|||
|
Duration: duration,
|
|||
|
Data: make(map[string]int64),
|
|||
|
}
|
|||
|
|
|||
|
go deadCache.Clean()
|
|||
|
return deadCache
|
|||
|
}
|
|||
|
|
|||
|
// Set 放置一个挂掉的实例
|
|||
|
func (dc *DeadCache) Set(key string) {
|
|||
|
dc.Lock()
|
|||
|
defer dc.Unlock()
|
|||
|
dc.Data[key] = time.Now().Unix()
|
|||
|
}
|
|||
|
|
|||
|
// Exists 检查某个实例是否存在
|
|||
|
func (dc *DeadCache) Exists(key string) bool {
|
|||
|
dc.RLock()
|
|||
|
defer dc.RUnlock()
|
|||
|
_, exists := dc.Data[key]
|
|||
|
return exists
|
|||
|
}
|
|||
|
|
|||
|
// Size 计算所有挂掉的实例的个数
|
|||
|
func (dc *DeadCache) Size() int {
|
|||
|
dc.RLock()
|
|||
|
defer dc.RUnlock()
|
|||
|
return len(dc.Data)
|
|||
|
}
|
|||
|
|
|||
|
// Clean 缓存清理方法,需要外层起一个goroutine来调用
|
|||
|
func (dc *DeadCache) Clean() []string {
|
|||
|
t1 := time.NewTicker(1 * time.Second)
|
|||
|
|
|||
|
for {
|
|||
|
<-t1.C
|
|||
|
|
|||
|
now := time.Now().Unix()
|
|||
|
dc.Lock()
|
|||
|
for instance, timestamp := range dc.Data {
|
|||
|
if now-timestamp > int64(dc.Duration) {
|
|||
|
delete(dc.Data, instance)
|
|||
|
}
|
|||
|
}
|
|||
|
dc.Unlock()
|
|||
|
}
|
|||
|
}
|