public Task UpdatePairAsync(QuoteMessage quote)
        {
            var assetPair = _pairs.AddOrUpdate(
                key: quote.AssetPair,
                addValueFactory: assetPairId => Create(quote),
                updateValueFactory: (assetPairId, pair) => UpdateAssetPairPrice(pair, quote));

            return(Task.WhenAll(_myNoSqlWriterWrapper.TryInsertOrReplaceAsync(AssetPairPriceNoSql.Create(assetPair)),
                                _redisService.AddAssetPairPriceAsync(assetPair)));
        }
        public Task InitCacheAsync(AssetPairPrice[] pairsToCache)
        {
            var entries = pairsToCache.Select(p => new KeyValuePair <string, AssetPairPrice>(p.AssetPair, p));

            _pairs = new ConcurrentDictionary <string, AssetPairPrice>(entries);

            var tasks = new List <Task>();

            foreach (var pair in _pairs.Values)
            {
                tasks.Add(_redisService.AddAssetPairPriceAsync(pair));
                tasks.Add(_myNoSqlWriterWrapper.TryInsertOrReplaceAsync(AssetPairPriceNoSql.Create(pair)));
            }

            return(Task.WhenAll(tasks));
        }
        IAssetPair IMarketProfileClient.Get(string id)
        {
            try
            {
                var data = _readerAssetPairNoSql.Get(
                    AssetPairPriceNoSql.GeneratePartitionKey(),
                    AssetPairPriceNoSql.GenerateRowKey(id));

                return(data?.AssetPair);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Cannot read from MyNoSQL. Table: ${AssetPairPriceNoSql.TableName}, " +
                                  $"PK: {AssetPairPriceNoSql.GeneratePartitionKey()}, " +
                                  $"RK: {AssetPairPriceNoSql.GenerateRowKey(id)}, Ex: {ex}");
                throw;
            }
        }