Высокопроизводительное временное хранилище - PullRequest
0 голосов
/ 09 ноября 2019

Я занимаюсь разработкой системы ботов, и есть разные алгоритмы, из которых пользователь может выбирать. Один из алгоритмов выполняет задания 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 был бы лучшим выбором, но все же я хотел бы узнать ваше мнение конкретно о моем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...