|
|
@@ -134,47 +134,6 @@ namespace molilian.core
|
|
|
if (is_ignore) continue;
|
|
|
}
|
|
|
|
|
|
- // 每小时调用次数统计(无论是否设置限制都要记录)
|
|
|
- string hourlyKey = $":override_rule_calls:{item.id}:{DateTime.Now:yyyyMMddHH}";
|
|
|
- try
|
|
|
- {
|
|
|
- long currentHourlyCalls = await RedisKit.IncrByAsync(hourlyKey);
|
|
|
- // 如果是第一次调用,设置过期时间为2小时
|
|
|
- if (currentHourlyCalls < 10)
|
|
|
- {
|
|
|
- await RedisKit.ExpireAsync(hourlyKey, 7200); // 2小时
|
|
|
- }
|
|
|
-
|
|
|
- // 如果设置了每小时限制且超过限制,跳过该规则
|
|
|
- if (item.hourly_calls_limit > 0 && currentHourlyCalls > item.hourly_calls_limit) continue;
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- // Redis错误时记录日志但不阻塞业务
|
|
|
- _ = new LoggerLibrary("OverrideRule", "Redis").Info($"Hourly limit check failed: {ex.Message}", ex.StackTrace).SaveAsync();
|
|
|
- }
|
|
|
-
|
|
|
- // 每日调用次数统计(无论是否设置限制都要记录)
|
|
|
- string dailyKey = $":override_rule_calls:{item.id}:{DateTime.Now:yyyyMMdd}";
|
|
|
- try
|
|
|
- {
|
|
|
- long currentDailyCalls = await RedisKit.IncrByAsync(dailyKey);
|
|
|
- if (currentDailyCalls < 10)
|
|
|
- {
|
|
|
- await RedisKit.ExpireAsync(dailyKey, 259200); // 3天
|
|
|
- }
|
|
|
- // 如果设置了每日限制且超过限制,跳过该规则
|
|
|
- if (item.daily_calls_limit > 0 && currentDailyCalls >= item.daily_calls_limit) continue;
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- // Redis错误时记录日志但不阻塞业务
|
|
|
- _ = new LoggerLibrary("OverrideRule", "Redis").Info($"Daily limit check failed: {ex.Message}", ex.StackTrace).SaveAsync();
|
|
|
- }
|
|
|
-
|
|
|
- // 关键词统计 - 长期缓存(6个月)用于历史数据分析
|
|
|
- await SaveKeywordStatisticsAsync(item.id, item.platform, original_text);
|
|
|
-
|
|
|
string output_text = item.output_text;
|
|
|
if (output_text.Contains("{url:query_text}")) output_text = output_text.Replace("{url:query_text}", HttpUtility.UrlEncode(original_text));
|
|
|
if (output_text.Contains("{url2:query_text}")) output_text = output_text.Replace("{url2:query_text}", HttpUtility.UrlEncode(HttpUtility.UrlEncode(original_text)));
|
|
|
@@ -184,6 +143,12 @@ namespace molilian.core
|
|
|
// 返回副本,避免占位符替换结果写回缓存中的规则
|
|
|
var matched = item.Clone();
|
|
|
matched.output_text = output_text;
|
|
|
+
|
|
|
+ var now = DateTime.Now;
|
|
|
+ if (!await TryRecordRewriteAsync(item, now)) continue;
|
|
|
+
|
|
|
+ // 日、小时重写次数已经与限额一起原子更新,这里只记录其他历史统计。
|
|
|
+ await SaveKeywordStatisticsAsync(item.id, item.platform, original_text, now);
|
|
|
return matched;
|
|
|
}
|
|
|
return null;
|
|
|
@@ -193,7 +158,7 @@ namespace molilian.core
|
|
|
/// 保存关键词统计数据到Redis,用于长期数据分析
|
|
|
/// 缓存周期:6个月
|
|
|
/// </summary>
|
|
|
- private static async Task SaveKeywordStatisticsAsync(int ruleId, string platform, string keyword)
|
|
|
+ private static async Task SaveKeywordStatisticsAsync(int ruleId, string platform, string keyword, DateTime now)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
@@ -201,32 +166,22 @@ namespace molilian.core
|
|
|
const int sixMonthsInSeconds = 180 * 86400;
|
|
|
|
|
|
// 关键词总请求次数统计 - 按月份
|
|
|
- string monthlyKey = $":keyword_stats:{platform}:{ruleId}:{DateTime.Now:yyyyMM}";
|
|
|
+ string monthlyKey = $":keyword_stats:{platform}:{ruleId}:{now:yyyyMM}";
|
|
|
await RedisKit.IncrByAsync(monthlyKey);
|
|
|
await RedisKit.ExpireAsync(monthlyKey, sixMonthsInSeconds);
|
|
|
|
|
|
- // 关键词总请求次数统计 - 按日
|
|
|
- string dailyKey = $":keyword_stats:{platform}:{ruleId}:{DateTime.Now:yyyyMMdd}";
|
|
|
- await RedisKit.IncrByAsync(dailyKey);
|
|
|
- await RedisKit.ExpireAsync(dailyKey, sixMonthsInSeconds);
|
|
|
-
|
|
|
- // 关键词总请求次数统计 - 按小时
|
|
|
- string hourlyKey = $":keyword_stats:{platform}:{ruleId}:{DateTime.Now:yyyyMMddHH}";
|
|
|
- await RedisKit.IncrByAsync(hourlyKey);
|
|
|
- await RedisKit.ExpireAsync(hourlyKey, sixMonthsInSeconds);
|
|
|
-
|
|
|
// 平台维度统计
|
|
|
- string platformMonthlyKey = $":keyword_stats:platform:{platform}:{DateTime.Now:yyyyMM}";
|
|
|
+ string platformMonthlyKey = $":keyword_stats:platform:{platform}:{now:yyyyMM}";
|
|
|
await RedisKit.IncrByAsync(platformMonthlyKey);
|
|
|
await RedisKit.ExpireAsync(platformMonthlyKey, sixMonthsInSeconds);
|
|
|
|
|
|
// 全局统计
|
|
|
- string globalMonthlyKey = $":keyword_stats:global:{DateTime.Now:yyyyMM}";
|
|
|
+ string globalMonthlyKey = $":keyword_stats:global:{now:yyyyMM}";
|
|
|
await RedisKit.IncrByAsync(globalMonthlyKey);
|
|
|
await RedisKit.ExpireAsync(globalMonthlyKey, sixMonthsInSeconds);
|
|
|
|
|
|
// 记录关键词集合(用于后续查询有哪些关键词)
|
|
|
- string keywordSetKey = $":keyword_stats:set:{platform}:{DateTime.Now:yyyyMM}";
|
|
|
+ string keywordSetKey = $":keyword_stats:set:{platform}:{now:yyyyMM}";
|
|
|
await RedisKit.SAddAsync(keywordSetKey, keyword);
|
|
|
await RedisKit.ExpireAsync(keywordSetKey, sixMonthsInSeconds);
|
|
|
}
|