缓存预热加锁

This commit is contained in:
2025-05-07 12:09:17 +08:00
parent f1a65c1ed8
commit 94fdab4e36
2 changed files with 37 additions and 38 deletions

View File

@ -220,10 +220,13 @@ func (hc *HttpClient) Request() *define.Response {
return hc.requestBackendApi()
}
// 上面若命中缓存, 则后续缓存实例不可能为nil, 无需判断
// TODO : 预热加锁, 并发请求触发预热, 仅触发一个即可
// 判断是否开启预热
cachePreHeatConfig := hc.reqConfig.CacheInstance.PreHeatConfig()
log.RecordDebug("接口请求命中缓存", map[string]any{
if nil == cachePreHeatConfig {
log.RecordDebug("接口请求命中缓存, PreHeatConfig未返回预热配置, 不做预热处理", map[string]any{}, hc.reqConfig)
return nil
}
log.RecordDebug("接口请求命中缓存, 进行预热策略处理", map[string]any{
"cache_info": cacheResult.CacheInfo,
}, hc.reqConfig)
defer func() {
@ -285,7 +288,35 @@ func (hc *HttpClient) Request() *define.Response {
"remaining_ttl": ttl,
}, hc.reqConfig)
// 配置了最小剩余时间,并且key剩余有效期小于最小剩余时间
// 预热加锁, 并发请求触发预热, 仅触发一个即可, 使用接口做key
if err := hc.reqConfig.CacheInstance.Lock(hc.reqConfig.FullUrl); err != nil {
log.RecordWarn("接口请求命中缓存, 缓存结果有效期大于剩余时长小于配置阈值, 触发预热, 加锁失败, 未执行预热", map[string]any{
"min_ttl": cachePreHeatConfig.MinTTL,
"remaining_ttl": ttl,
"err_msg": err.Error(),
}, hc.reqConfig)
return
}
log.RecordDebug("接口请求命中缓存, 缓存结果有效期大于剩余时长小于配置阈值, 触发预热, 加锁成功, 执行预热", map[string]any{
"min_ttl": cachePreHeatConfig.MinTTL,
"remaining_ttl": ttl,
"lock_key": hc.reqConfig.FullUrl,
}, hc.reqConfig)
_ = hc.requestBackendApi()
if err := hc.reqConfig.CacheInstance.Unlock(hc.reqConfig.FullUrl); nil != err {
log.RecordError("接口请求命中缓存, 缓存结果有效期大于剩余时长小于配置阈值, 触发预热, 执行预热后, 释放锁失败", map[string]any{
"min_ttl": cachePreHeatConfig.MinTTL,
"remaining_ttl": ttl,
"lock_key": hc.reqConfig.FullUrl,
"err_msg": err.Error(),
}, hc.reqConfig)
return
}
log.RecordDebug("接口请求命中缓存, 缓存结果有效期大于剩余时长小于配置阈值, 触发预热, 执行预热后, 释放锁成功", map[string]any{
"min_ttl": cachePreHeatConfig.MinTTL,
"remaining_ttl": ttl,
"lock_key": hc.reqConfig.FullUrl,
}, hc.reqConfig)
}()
}()
// 命中缓存必然请求成功, 直接记录成功日志即可