Задать вопрос
LuckyReveal
@LuckyReveal

Оптимизация ресурсоёмкой функции (linq)?

Добрый день.

Функция, которую нужно оптимизировать, вызывается примерно 100.000 раз в сутки. Проект в облаке азура, сами понимаете…


Вообщем.(Код урезан до нужной фукнции)
www.everfall.com/paste/id.php?wqfnoehtgdp1


Небольшую оптимизацию в виде вынесения запроса к БД в компилированную функцию, как видите, я уже провел.


Есть раблица Exchanger(5.000 записей, прирост 200 в сутки). Она хранит данные о пользователе, Id, поинты, активность лайков и фолловов и некоторые другие данные.

Есть раблица LikeExchanger_Data(500.000 записей, прирост 20.000 в сутки). Она хранит данные о лайках(Дабы одна фотография не показывалась несколько раз одному и тому же пользователю.).

Пользователь поставил лайк, в LikeExchanger_Data внесли данные о лайке, вызвалась LikesList(выше в коде фукнция), которая вернет новый список фотографий, который не будет включать фотографии, на которых уже стоит лайк.


На данный момент, от момента POST запроса с сайта через API до возвращения результата — ~250мс. Нужно сократить хотя бы до 150-180.


Была у меня мысль разнести логику. На самом сервере хранить горячий кэш не только Exchanger, но и LikeExchanger_Data, а запросы к бд отдать на съедение бекенду через Azure Service Bus.
  • Вопрос задан
  • 4480 просмотров
Подписаться 3 Оценить 9 комментариев
Решения вопроса 1
lam0x86
@lam0x86
Может, так?

public class ExchangerProvider
{
    public static IEnumerable<Robofollower.Exchanger> LikesList(int userId)
    {
        using (var context = new DataClassesDataContext())
        {
            return context.Exchanger
                .Where(e => e.UserId != userId)
                .Where(e => e.LikeActive)
                .Where(e => e.Points >= 1)
                .Where
                (e => 
                    context.LikeExchanger_Data
                        .Where(l => l.UserId == userId)
                        .All(l => l.MediaId != e.MediaId)
                )
                .OrderByDescending(e => e.Points)
                .Take(5)
                .ToList();
        }
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы