|
- 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()
- }
- }
|