mirror of
https://github.com/woodchen-ink/random-api-go.git
synced 2025-07-18 13:52:02 +08:00
新增FetchURLsWithOptions方法以支持跳过缓存的URL获取,并更新RefreshDataSource方法以实现强制刷新数据源的功能。同时,调整Preloader中的数据源刷新逻辑以使用新方法。
This commit is contained in:
parent
1949c8e9f3
commit
32b1cd94ff
@ -61,6 +61,11 @@ func getIntConfig(key string, defaultValue int) int {
|
|||||||
|
|
||||||
// FetchURLs 从数据源获取URL列表
|
// FetchURLs 从数据源获取URL列表
|
||||||
func (dsf *DataSourceFetcher) FetchURLs(dataSource *model.DataSource) ([]string, error) {
|
func (dsf *DataSourceFetcher) FetchURLs(dataSource *model.DataSource) ([]string, error) {
|
||||||
|
return dsf.FetchURLsWithOptions(dataSource, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FetchURLsWithOptions 从数据源获取URL列表,支持跳过缓存选项
|
||||||
|
func (dsf *DataSourceFetcher) FetchURLsWithOptions(dataSource *model.DataSource, skipCache bool) ([]string, error) {
|
||||||
// API类型的数据源直接实时请求,不使用缓存
|
// API类型的数据源直接实时请求,不使用缓存
|
||||||
if dataSource.Type == "api_get" || dataSource.Type == "api_post" {
|
if dataSource.Type == "api_get" || dataSource.Type == "api_post" {
|
||||||
log.Printf("实时请求API数据源 (类型: %s, ID: %d)", dataSource.Type, dataSource.ID)
|
log.Printf("实时请求API数据源 (类型: %s, ID: %d)", dataSource.Type, dataSource.ID)
|
||||||
@ -70,11 +75,15 @@ func (dsf *DataSourceFetcher) FetchURLs(dataSource *model.DataSource) ([]string,
|
|||||||
// 构建内存缓存的key(使用数据源ID)
|
// 构建内存缓存的key(使用数据源ID)
|
||||||
cacheKey := fmt.Sprintf("datasource_%d", dataSource.ID)
|
cacheKey := fmt.Sprintf("datasource_%d", dataSource.ID)
|
||||||
|
|
||||||
// 先检查内存缓存
|
// 如果不跳过缓存,先检查内存缓存
|
||||||
|
if !skipCache {
|
||||||
if cachedURLs, exists := dsf.cacheManager.GetFromMemoryCache(cacheKey); exists && len(cachedURLs) > 0 {
|
if cachedURLs, exists := dsf.cacheManager.GetFromMemoryCache(cacheKey); exists && len(cachedURLs) > 0 {
|
||||||
log.Printf("从内存缓存获取到 %d 个URL (数据源ID: %d)", len(cachedURLs), dataSource.ID)
|
log.Printf("从内存缓存获取到 %d 个URL (数据源ID: %d)", len(cachedURLs), dataSource.ID)
|
||||||
return cachedURLs, nil
|
return cachedURLs, nil
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("跳过缓存,强制从数据源获取最新数据 (数据源ID: %d)", dataSource.ID)
|
||||||
|
}
|
||||||
|
|
||||||
var urls []string
|
var urls []string
|
||||||
var err error
|
var err error
|
||||||
@ -196,10 +205,10 @@ func (dsf *DataSourceFetcher) fetchS3URLs(dataSource *model.DataSource) ([]strin
|
|||||||
|
|
||||||
// updateDataSourceSyncTime 更新数据源的同步时间
|
// updateDataSourceSyncTime 更新数据源的同步时间
|
||||||
func (dsf *DataSourceFetcher) updateDataSourceSyncTime(dataSource *model.DataSource) error {
|
func (dsf *DataSourceFetcher) updateDataSourceSyncTime(dataSource *model.DataSource) error {
|
||||||
// 这里需要导入database包来更新数据库
|
if err := database.DB.Model(dataSource).Update("last_sync", dataSource.LastSync).Error; err != nil {
|
||||||
// 为了避免循环依赖,我们通过回调或者接口来处理
|
return fmt.Errorf("failed to update sync time for data source %d: %w", dataSource.ID, err)
|
||||||
// 暂时先记录日志,具体实现在主服务中处理
|
}
|
||||||
log.Printf("需要更新数据源 %d 的同步时间", dataSource.ID)
|
log.Printf("已更新数据源 %d 的同步时间", dataSource.ID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,3 +224,16 @@ func (dsf *DataSourceFetcher) PreloadDataSource(dataSource *model.DataSource) er
|
|||||||
log.Printf("数据源 %d 预加载完成", dataSource.ID)
|
log.Printf("数据源 %d 预加载完成", dataSource.ID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RefreshDataSource 强制刷新数据源(跳过缓存)
|
||||||
|
func (dsf *DataSourceFetcher) RefreshDataSource(dataSource *model.DataSource) error {
|
||||||
|
log.Printf("开始强制刷新数据源 (类型: %s, ID: %d)", dataSource.Type, dataSource.ID)
|
||||||
|
|
||||||
|
_, err := dsf.FetchURLsWithOptions(dataSource, true) // 跳过缓存
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to refresh data source %d: %w", dataSource.ID, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("数据源 %d 强制刷新完成", dataSource.ID)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -154,7 +154,7 @@ func (p *Preloader) RefreshDataSource(dataSourceID uint) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("手动刷新数据源 %d", dataSourceID)
|
log.Printf("手动刷新数据源 %d", dataSourceID)
|
||||||
return p.dataSourceFetcher.PreloadDataSource(&dataSource)
|
return p.dataSourceFetcher.RefreshDataSource(&dataSource)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RefreshEndpoint 手动刷新指定端点的所有数据源
|
// RefreshEndpoint 手动刷新指定端点的所有数据源
|
||||||
@ -184,7 +184,7 @@ func (p *Preloader) RefreshEndpoint(endpointID uint) error {
|
|||||||
go func(ds model.DataSource) {
|
go func(ds model.DataSource) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
|
||||||
if err := p.dataSourceFetcher.PreloadDataSource(&ds); err != nil {
|
if err := p.dataSourceFetcher.RefreshDataSource(&ds); err != nil {
|
||||||
log.Printf("刷新数据源 %d 失败: %v", ds.ID, err)
|
log.Printf("刷新数据源 %d 失败: %v", ds.ID, err)
|
||||||
lastErr = err
|
lastErr = err
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user