Я занимаюсь разработкой системы ботов, и есть разные алгоритмы, из которых пользователь может выбирать. Один из алгоритмов выполняет задания cron в определенное время, и мне нужно только временно хранить данные объектов класса, потому что при запуске приложения сохраненные данные должны быть сброшены в любом случае. Эти алгоритмы сохраняются в ограниченном сервисе. Я пытался сделать сервис синглтон, но это не помогло вообще. В этом случае есть два варианта / возможно три варианта: использовать MSSQL (плохая практика), использовать базу данных NoSQL или Redis. Я слышал положительные отзывы о Redis и о том, что он обеспечивает высокую производительность.
Проблема : В настоящее время я храню данные на сервере MSSQL. Первая проблема заключается в том, что я создаю таблицы, специфичные для этого алгоритма, что является плохой практикой. Представьте, что у меня есть базовый класс для алгоритмов / стратегий. Эти поля ниже специфичны для одного алгоритма и не будут использоваться другим. Вторая проблема заключается в том, что мне приходится обновлять базу данных после каждого изменения свойств, что является потерей производительности.
Моя настройка:
// Relationships
// One-to-many
builder.Entity<BotSession>(entity =>
{
entity.HasOne(bs => bs.Bot)
.WithMany(b => b.BotSessions)
.HasForeignKey(bs => bs.BotId)
.OnDelete(DeleteBehavior.Cascade);
// Unique key
entity.HasIndex(bs => new { bs.TrendType, bs.BotId })
.IsUnique();
});
builder.Entity<Aggregation>(entity =>
{
entity.HasOne(a => a.BotSession)
.WithMany(bs => bs.Aggregations)
.HasForeignKey(a => a.BotSessionId)
.OnDelete(DeleteBehavior.Cascade);
// Unique key
entity.HasIndex(a => new { a.Type, a.BotSessionId })
.IsUnique();
});
// Classes
public class BotSession
{
public BotSession()
{
}
public BotSession(TrendType trendType, int botId)
{
TrendType = trendType;
CanTrade = false;
StopLossValue = null;
BotId = botId;
}
public int Id { get; set; }
public TrendType TrendType { get; set; }
public bool CanTrade { get; set; }
[Column(TypeName = "decimal(18,8)")]
public decimal? StopLossValue { get; set; }
[Column(TypeName = "decimal(18,8)")]
public decimal? NTimes { get; set; }
public int BotId { get; set; }
public Bot Bot { get; set; }
public List<Aggregation> Aggregations { get; set; }
public bool IsUptrendSession()
=> TrendType == TrendType.Uptrend;
}
public enum AggregationType
{
First,
PreLast,
Last
}
public class Aggregation
{
public Aggregation()
{
}
public Aggregation(AggregationType type, BinanceKline kline, int botSessionId)
{
Type = type;
OpenTime = kline.OpenTime;
CloseTime = kline.CloseTime;
Open = kline.Open;
High = kline.High;
Low = kline.Low;
Close = kline.Close;
Volume = kline.Volume;
BotSessionId = botSessionId;
}
public int Id { get; set; }
public DateTime OpenTime { get; set; }
public DateTime CloseTime { get; set; }
[Column(TypeName = "decimal(18,8)")]
public decimal Open { get; set; }
[Column(TypeName = "decimal(18,8)")]
public decimal High { get; set; }
[Column(TypeName = "decimal(18,8)")]
public decimal Low { get; set; }
[Column(TypeName = "decimal(18,8)")]
public decimal Close { get; set; }
[Column(TypeName = "decimal(18,8)")]
public decimal Volume { get; set; }
public AggregationType Type { get; set; }
public int BotSessionId { get; set; }
public BotSession BotSession { get; set; }
}
Эти две таблицыжизненно важны для одного из моих алгоритмов, но не для остальных, что заставляет меня задуматься о реальном решении.
Помните , что класс агрегации должен наследоваться от другого класса.
Что было бы лучшим решением для моего случая, включая это наследование?
Я проверил следующие решения: - IMemoryCache https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-3.0 - Redis https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-3.0 - База данных NoSQL
Исходя из других мнений, я думаю, что Redis был бы лучшим выбором, но все же я хотел бы узнать ваше мнение конкретно о моем случае.