|
|
@@ -34,7 +34,8 @@ namespace molilian.core
|
|
|
_end_point = Environment.GetEnvironmentVariable("EndPoint");
|
|
|
}
|
|
|
|
|
|
- private static readonly object _lockObj = new();
|
|
|
+ private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
|
|
|
+
|
|
|
private static IEnumerable<JdPoolDTO> _cached;
|
|
|
private static IEnumerable<JdPoolDTO> _all_cached;
|
|
|
public static async Task<JdPoolDTO?> GetOneAsync()
|
|
|
@@ -122,49 +123,78 @@ namespace molilian.core
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
public static async Task<IEnumerable<JdPoolDTO>> AllListAsync(bool force = false)
|
|
|
{
|
|
|
if (!force && _all_cached != default) return _all_cached;
|
|
|
- string cache_key = $"cache:all_jd_pool";
|
|
|
- var list = await RedisKit.GetAsync<IEnumerable<JdPoolDTO>>(cache_key);
|
|
|
- if (force || list == default)
|
|
|
+
|
|
|
+ try
|
|
|
{
|
|
|
- lock (_lockObj)
|
|
|
+ await _semaphore.WaitAsync();
|
|
|
+
|
|
|
+ string cache_key = $"cache:all_jd_pool";
|
|
|
+ var list = await RedisKit.GetAsync<IEnumerable<JdPoolDTO>>(cache_key);
|
|
|
+
|
|
|
+ if (force || list == default)
|
|
|
{
|
|
|
list = new DBContext.Table("jd_pool").Select<JdPoolDTO>();
|
|
|
if (list == null) return default;
|
|
|
|
|
|
- _ = RedisKit.SetAsync(cache_key, list, 30 * 86400);
|
|
|
+ // 等待 Redis 写入完成
|
|
|
+ await RedisKit.SetAsync(cache_key, list, 30 * 86400);
|
|
|
}
|
|
|
+
|
|
|
+ _all_cached = list;
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ // 发生异常时返回上一次的缓存,如果没有则返回默认值
|
|
|
+ return _all_cached ?? default;
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ _semaphore.Release();
|
|
|
}
|
|
|
- _all_cached = list;
|
|
|
- return list;
|
|
|
}
|
|
|
|
|
|
public static async Task<IEnumerable<JdPoolDTO>> ListAsync(bool force = false)
|
|
|
{
|
|
|
if (!force && _cached != null) return _cached;
|
|
|
- string cache_key = $"cache:jd_pool";
|
|
|
- var list = await RedisKit.GetAsync<IEnumerable<JdPoolDTO>>(cache_key);
|
|
|
- if (force || list == null)
|
|
|
+
|
|
|
+ try
|
|
|
{
|
|
|
- lock (_lockObj)
|
|
|
+ await _semaphore.WaitAsync(); // 异步等待锁
|
|
|
+
|
|
|
+ string cache_key = $"cache:jd_pool";
|
|
|
+ var list = await RedisKit.GetAsync<IEnumerable<JdPoolDTO>>(cache_key);
|
|
|
+
|
|
|
+ if (force || list == null)
|
|
|
{
|
|
|
list = new DBContext.Table("jd_pool")
|
|
|
.Where("status=@status", new { status = 1 })
|
|
|
.Select<JdPoolDTO>();
|
|
|
- if (list == null) return default;
|
|
|
|
|
|
- foreach (var item in list)
|
|
|
+ if (list != null)
|
|
|
{
|
|
|
- _ = RiskControlCore.SetCallsAsync(TkChannelEnum.jd, item.id, DateTime.Now.ToString("yyyyMMddHH"), item.current_hourly_calls);
|
|
|
- _ = RiskControlCore.SetCallsAsync(TkChannelEnum.jd, item.id, DateTime.Now.ToString("yyyyMMdd"), item.current_daily_calls);
|
|
|
+ foreach (var item in list)
|
|
|
+ {
|
|
|
+ _ = RiskControlCore.SetCallsAsync(TkChannelEnum.jd, item.id,
|
|
|
+ DateTime.Now.ToString("yyyyMMddHH"), item.current_hourly_calls);
|
|
|
+ _ = RiskControlCore.SetCallsAsync(TkChannelEnum.jd, item.id,
|
|
|
+ DateTime.Now.ToString("yyyyMMdd"), item.current_daily_calls);
|
|
|
+ }
|
|
|
+ await RedisKit.SetAsync(cache_key, list, 30 * 86400);
|
|
|
}
|
|
|
- _ = RedisKit.SetAsync(cache_key, list, 30 * 86400);
|
|
|
}
|
|
|
+
|
|
|
+ _cached = list;
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ _semaphore.Release(); // 确保释放锁
|
|
|
}
|
|
|
- _cached = list;
|
|
|
- return list;
|
|
|
}
|
|
|
|
|
|
public static void Refresh()
|