zhangzengfei
2024-09-26 88b1f1d1d14a8fe9e3dde2f363a89d821fc0e641
cache/cache.go
@@ -20,53 +20,59 @@
   PRE_DBTABLE = "dbTable_"
)
type CmapItem struct {
type AreaMapItem struct {
   sync.Mutex
   Area map[string]*shardmap.ShardMap
}
var CacheMap *CmapItem
var CaptureDbMap *AreaMapItem
var RealNameDbMap = shardmap.New(uint8(*threadnum))
var KeyPersonDbMap = shardmap.New(uint8(*threadnum))
var doOnce sync.Once
func ReInitDbTablePersonsCache() {
   CacheMap.Lock()
   defer CacheMap.Unlock()
   if CacheMap == nil {
      CacheMap = &CmapItem{
         Area: make(map[string]*shardmap.ShardMap),
      }
   }
   for tableId, _ := range CacheMap.Area {
      delete(CacheMap.Area, tableId)
   }
   initDbTablePersonsCache()
}
func InitDbTablePersons() {
func InitCache() {
   doOnce.Do(func() {
      flag.Parse()
      CacheMap = &CmapItem{
      CaptureDbMap = &AreaMapItem{
         Area: make(map[string]*shardmap.ShardMap),
      }
      // 初始化未分类, 没有小区id的档案
      CacheMap.Area[Unfiled] = shardmap.New(uint8(*threadnum))
      CaptureDbMap.Area[Unfiled] = shardmap.New(uint8(*threadnum))
   })
   initDbTablePersonsCache()
   initRealNamePersonsCache()
   initKeyPersonsCache()
}
func ReInitDbTablePersonsCache() {
   CaptureDbMap.Lock()
   defer CaptureDbMap.Unlock()
   if CaptureDbMap == nil {
      CaptureDbMap = &AreaMapItem{
         Area: make(map[string]*shardmap.ShardMap),
      }
   }
   for tableId, _ := range CaptureDbMap.Area {
      delete(CaptureDbMap.Area, tableId)
   }
   initDbTablePersonsCache()
}
func initDbTablePersonsCache() {
   // 缓存底库中的全部人员信息
   var dbpApi db.DbPersons
   total, e := dbpApi.GetPersonTotal("")
   var psApi db.PersonStatus
   accessAreas, _ := psApi.GetPersonAccessedAreas()
   // 暂时去掉到访小区过滤
   //var psApi db.PersonStatus
   //accessAreas, _ := psApi.GetPersonAccessedAreas()
   logger.Debugf("所有底库共有%d条记录", total)
   logger.Debugf("抓拍档案库共有%d条记录", total)
   if e == nil && total > 0 {
      queryEachNum := *querynum
      qn := int(total) / *threadnum
@@ -90,36 +96,68 @@
               logger.Error(err)
               return
            }
            logger.Debugf("获取%d条人员信息", len(dbPersons))
            CacheMap.Lock()
            logger.Debugf("eachNum:%d, 获取%d条人员信息", queryEachNum, len(dbPersons))
            CaptureDbMap.Lock()
            areaId := ""
            for _, value := range dbPersons {
               areaId = value.AreaId
               // 没有小区id的人员
               if areaId == "" {
                  CacheMap.Area[Unfiled].Set(value.Id, value)
                  CacheMap.Area[Unfiled].Settime()
                  CaptureDbMap.Area[Unfiled].Set(value.Id, value)
                  CaptureDbMap.Area[Unfiled].Settime()
                  continue
               }
               for _, areaId := range accessAreas[value.Id] {
                  if _, ok := CacheMap.Area[areaId]; !ok {
                     CacheMap.Area[areaId] = shardmap.New(uint8(*threadnum))
                  }
                  CacheMap.Area[areaId].Set(value.Id, value)
                  CacheMap.Area[areaId].Settime()
               //for _, areaId := range accessAreas[value.Id] {
               if _, ok := CaptureDbMap.Area[areaId]; !ok {
                  CaptureDbMap.Area[areaId] = shardmap.New(uint8(*threadnum))
               }
               CaptureDbMap.Area[areaId].Set(value.Id, value)
               CaptureDbMap.Area[areaId].Settime()
               //}
            }
            CacheMap.Unlock()
            CaptureDbMap.Unlock()
         }(j)
      }
      wg.Wait()
      logger.Debug("底库人员缓存完成用时:", time.Since(temptime))
      logger.Debug("抓拍档案库人员缓存完成用时:", time.Since(temptime))
      for k, v := range CaptureDbMap.Area {
         logger.Debugf("Cache area %s item len %d ", k, v.GetLen())
      }
   }
}
func initRealNamePersonsCache() {
   var dbApi db.Layouts
   dbPersons, err := dbApi.GetRealNamePersonList()
   if err != nil {
      logger.Error("init real-name persons error,", err.Error())
   }
   for _, value := range dbPersons {
      RealNameDbMap.Set(value.Id, value)
   }
   logger.Debugf("常住人口共有%d条记录", len(dbPersons))
}
func initKeyPersonsCache() {
   var dbApi db.Layouts
   dbPersons, err := dbApi.GetKeyPersonList()
   if err != nil {
      logger.Error("init real-name persons error,", err.Error())
   }
   for _, value := range dbPersons {
      KeyPersonDbMap.Set(value.Id, value)
   }
   logger.Debugf("重点人员共有%d条记录", len(dbPersons))
}
// UpdateDbPersonsCacheById 更新缓存中的全部人员信息
@@ -130,22 +168,28 @@
      logger.Error(err)
      return
   }
   if info.AreaId != "" {
      CacheMap.Lock()
      defer CacheMap.Unlock()
      if _, ok := CacheMap.Area[info.AreaId]; !ok {
         CacheMap.Area[info.AreaId] = shardmap.New(uint8(*threadnum))
   if info != nil && info.AreaId != "" {
      if _, ok := CaptureDbMap.Area[info.AreaId]; !ok {
         CaptureDbMap.Lock()
         defer CaptureDbMap.Unlock()
         CaptureDbMap.Area[info.AreaId] = shardmap.New(uint8(*threadnum))
      }
      CacheMap.Area[info.AreaId].Set(info.Id, info)
      CacheMap.Area[info.AreaId].Settime()
      CaptureDbMap.Area[info.AreaId].Set(info.Id, info)
      CaptureDbMap.Area[info.AreaId].Settime()
   }
}
func DeleteDbPersonsCacheById(id string) {
   for key, _ := range CaptureDbMap.Area {
      CaptureDbMap.Area[key].Del(id)
   }
}
func RealTimeAddPersonInfoToCache(tableId string, id string, faceFeature string, enable int32, carNo string) {
   CacheMap.Lock()
   defer CacheMap.Unlock()
   if _, ok := CacheMap.Area[tableId]; !ok {
      CacheMap.Area[tableId] = shardmap.New(uint8(*threadnum))
   CaptureDbMap.Lock()
   defer CaptureDbMap.Unlock()
   if _, ok := CaptureDbMap.Area[tableId]; !ok {
      CaptureDbMap.Area[tableId] = shardmap.New(uint8(*threadnum))
   }
   var ei = protomsg.Esinfo{
      Id:          id,
@@ -154,16 +198,16 @@
      Enable:      enable,
      CarNo:       carNo,
   }
   CacheMap.Area[tableId].Set(id, &ei)
   CaptureDbMap.Area[tableId].Set(id, &ei)
   logger.Debug("id:", id, ",tableId:", ",len(faceFeature):", len(faceFeature), ",tableId:", tableId, ",enable:", enable)
}
func RealTimeDelPersonFromCache(tableId string, id string) {
   logger.Debug("DelPersonFromCache,tableId:", tableId, ",id:", id)
   CacheMap.Lock()
   defer CacheMap.Unlock()
   if _, ok := CacheMap.Area[tableId]; ok {
      CacheMap.Area[tableId].Del(id)
   CaptureDbMap.Lock()
   defer CaptureDbMap.Unlock()
   if _, ok := CaptureDbMap.Area[tableId]; ok {
      CaptureDbMap.Area[tableId].Del(id)
      logger.Debug("DelPerson ok success")
   } else {
      logger.Error("tableId:", tableId, " not exist")
@@ -172,27 +216,27 @@
func RealTimeDelTable(tableId string) {
   logger.Debug("RealTimeDelTable tableId:", tableId)
   CacheMap.Lock()
   defer CacheMap.Unlock()
   CaptureDbMap.Lock()
   defer CaptureDbMap.Unlock()
   if dtM, ok := CacheMap.Area[PRE_DBTABLE]; ok {
   if dtM, ok := CaptureDbMap.Area[PRE_DBTABLE]; ok {
      dtM.Del(tableId)
   }
   if _, ok := CacheMap.Area[tableId]; ok {
      delete(CacheMap.Area, tableId)
   if _, ok := CaptureDbMap.Area[tableId]; ok {
      delete(CaptureDbMap.Area, tableId)
   }
}
// 使底库生效,将底库中的所有生效状态的人特征添加到缓存
func RealTimeUpdateTable(tableId string, enable int32) {
   logger.Debug("RealTimeUpdateTable tableId:", tableId, ",enable:", enable)
   CacheMap.Lock()
   defer CacheMap.Unlock()
   CaptureDbMap.Lock()
   defer CaptureDbMap.Unlock()
   if _, ok := CacheMap.Area[PRE_DBTABLE]; !ok {
      CacheMap.Area[PRE_DBTABLE] = shardmap.New(uint8(*threadnum))
   if _, ok := CaptureDbMap.Area[PRE_DBTABLE]; !ok {
      CaptureDbMap.Area[PRE_DBTABLE] = shardmap.New(uint8(*threadnum))
   }
   CacheMap.Area[PRE_DBTABLE].Set(tableId, enable == 1)
   CaptureDbMap.Area[PRE_DBTABLE].Set(tableId, enable == 1)
}
func UpdateCache(changeMsg *protomsg.EsPersonCacheChange) {