zhangzengfei
2024-10-20 c8a641dd784c071f83a0d90c35f617607fd0811b
nvcs/cache.go
@@ -1,6 +1,7 @@
package nvcs
import (
   "container/list"
   "fmt"
   "time"
@@ -10,13 +11,13 @@
)
type simpleCache struct {
   data       map[int64]elevatorRunData
   data       *list.List
   expiration time.Duration
}
func newCache(expiration time.Duration) *simpleCache {
   return &simpleCache{
      data:       make(map[int64]elevatorRunData),
      data:       list.New(),
      expiration: expiration,
   }
}
@@ -31,9 +32,12 @@
      data.Floor = gRFIDFloor
   }
   lastData := c.data.Back()
   c.data.PushBack(data)
   // 如果楼层相同,并且数据在1秒内,则忽略
   if existingData, ok := c.data[data.Timestamp]; ok {
      if existingData.Floor == data.Floor {
   if lastData.Value.(elevatorRunData).Timestamp == data.Timestamp {
      if lastData.Value.(elevatorRunData).Floor == data.Floor {
         return
      }
   }
@@ -72,14 +76,23 @@
      go addFloorToOSD(floorText)
   }
   c.data[data.Timestamp] = data
   c.data.PushBack(data)
}
// 删除过期数据
func (c *simpleCache) cleanExpired() {
   for t := range c.data {
      if time.Since(time.Unix(t, 0)) > c.expiration {
         delete(c.data, t)
   now := time.Now()
   // 从队列头部开始检查是否有过期数据
   for c.data.Len() > 0 {
      elem := c.data.Front() // 获取队列头部的元素
      item := elem.Value.(elevatorRunData)
      if now.Sub(time.Unix(item.Timestamp, 0)) > c.expiration {
         // 如果数据已经过期,则从队列中删除
         c.data.Remove(elem)
      } else {
         // 因为数据按时间顺序存储,遇到不过期的数据后就可以停止检查
         break
      }
   }
}