checkAndUpdateData
()
| 156 | |
| 157 | // checkAndUpdateData |
| 158 | func checkAndUpdateData() error { |
| 159 | pigMutex.Lock() |
| 160 | defer pigMutex.Unlock() |
| 161 | |
| 162 | // 如果有缓存且距上次更新不足 24 小时,直接返回 |
| 163 | if len(pigCache) > 0 && time.Since(lastUpdateTime) < 24*time.Hour { |
| 164 | return nil |
| 165 | } |
| 166 | |
| 167 | dataBytes, err := engine.GetLazyData("pig_data.json", true) |
| 168 | if err != nil { |
| 169 | return errors.New("读取数据文件失败: " + err.Error()) |
| 170 | } |
| 171 | |
| 172 | var data pigResponse |
| 173 | if err := json.Unmarshal(dataBytes, &data); err != nil { |
| 174 | return errors.New("解析JSON失败: " + err.Error()) |
| 175 | } |
| 176 | |
| 177 | if len(data.Images) == 0 { |
| 178 | return errors.New("数据文件为空") |
| 179 | } |
| 180 | |
| 181 | pigCache = data.Images |
| 182 | |
| 183 | // 更新缓存时,顺便重构一份查询 Map |
| 184 | newMap := make(map[string]*pigImage, len(pigCache)) |
| 185 | for i := range pigCache { |
| 186 | newMap[pigCache[i].ID] = &pigCache[i] |
| 187 | } |
| 188 | pigMap = newMap |
| 189 | |
| 190 | lastUpdateTime = time.Now() |
| 191 | return nil |
| 192 | } |
| 193 | |
| 194 | func (img *pigImage) fetch() ([]byte, error) { |
| 195 | if img.Filename == "" { |