public override async Task Execute() { foreach (var assetId in (await _assetPairsApi.List()).Select(x => x.Id)) { if (!_candlesShardValidator.CanHandle(assetId)) { continue; } foreach (var priceType in Constants.StoredPriceTypes) { foreach (var timeInterval in Constants.StoredIntervals) { var key = RedisCandlesCacheService.GetKey(_market, assetId, priceType, timeInterval); var candlesAmountToStore = _candlesAmountManager.GetCandlesAmountToStore(timeInterval); _database.SortedSetRemoveRangeByRank(key, 0, -candlesAmountToStore - 1, CommandFlags.FireAndForget); } } } }
private async Task CacheAssetPairCandlesAsync(AssetPair assetPair, DateTime now) { if (!_candlesShardValidator.CanHandle(assetPair.Id)) { await _log.WriteInfoAsync(nameof(CandlesCacheInitalizationService), nameof(InitializeCacheAsync), null, $"Skipping {assetPair.Id} caching, since it doesn't meet sharding condition"); return; } await _log.WriteInfoAsync(nameof(CandlesCacheInitalizationService), nameof(InitializeCacheAsync), null, $"Caching {assetPair.Id} candles history..."); try { foreach (var priceType in Constants.StoredPriceTypes) { foreach (var timeInterval in Constants.StoredIntervals) { var alignedToDate = now.TruncateTo(timeInterval).AddIntervalTicks(1, timeInterval); var candlesAmountToStore = _candlesAmountManager.GetCandlesAmountToStore(timeInterval); var candles = await _candlesHistoryRepository.GetLastCandlesAsync(assetPair.Id, timeInterval, priceType, alignedToDate, candlesAmountToStore); await _candlesCacheService.InitializeAsync(assetPair.Id, priceType, timeInterval, candles.ToArray()); } } } catch (Exception e) { await _log.WriteErrorAsync(nameof(CandlesCacheInitalizationService), nameof(CacheAssetPairCandlesAsync), $"Couldn't cache candles history for asset pair [{assetPair.Id}]", e); } finally { await _log.WriteInfoAsync(nameof(CandlesCacheInitalizationService), nameof(CacheAssetPairCandlesAsync), null, $"{assetPair.Id} candles history caching finished"); } }