Оптимизация Redis с помощью .NET и конкретный пример того, как хранить и получать элементы из Hash - PullRequest
3 голосов
/ 10 апреля 2019

У меня более 15000 элементов POCO, хранящихся в списке Redis.Я использую ServiceStack, чтобы сохранить и получить их.Тем не менее, я не доволен временем отклика, которое у меня есть, когда я получаю их в сетке.Пока я читаю, было бы лучше сохранить эти объекты в хэше, но, к сожалению, я не смог найти хорошего примера для моего случая: (

Это метод, который я использую, чтобы поместить их в мою таблицу

public IEnumerable<BookingRequestGridViewModel> GetAll()
{
    try
    {
        var redisManager = new RedisManagerPool(Global.RedisConnector);                
        using (var redis = redisManager.GetClient())
        {
            var redisEntities = redis.As<BookingRequestModel>();
            var result =redisEntities.Lists["BookingRequests"].GetAll().Select(z=> new BookingRequestGridViewModel
            {
                CreatedDate =z.CreatedDate,
                DropOffBranchName =z.DropOffBranch !=null ? z.DropOffBranch.Name : string.Empty,
                DropOffDate =z.DropOffDate,
                DropOffLocationName = z.DropOffLocation != null ? z.DropOffLocation.Name : string.Empty,
                Id =z.Id.Value,
                Number =z.Number,
                PickupBranchName =z.PickUpBranch !=null ? z.PickUpBranch.Name :string.Empty,
                PickUpDate =z.PickUpDate,
                PickupLocationName = z.PickUpLocation != null ? z.PickUpLocation.Name : string.Empty
            }).OrderBy(z=>z.Id);                   
            return result;
        }
    }
    catch (Exception ex)
    {
        return null;
    }
}

Обратите внимание, что я использую redisEntities.Lists["BookingRequests"].GetAll(), что вызывает проблемы с производительностью (я хотел бы использовать только redisEntities.Lists["BookingRequests"], но я теряю последние обновления из сетки - после редактирования)

Я бы хотелхотелось бы знать, является ли сохранение их в списке хорошим подходом, так как для меня очень важно иметь быструю сетку (у меня теперь есть 1 секунда при огромной подкачке).

Пожалуйста, совет!

1 Ответ

2 голосов
/ 10 апреля 2019

Во-первых, вы не должны создавать новый Redis Client Manager , такой как RedisManagerPool каждый раз, в вашем приложении должен быть только один экземпляр RedisManagerPool, из которого разрешены все клиенты.

Но в противном случае я бы переосмыслил вашу стратегию доступа к данным, загрузка 15K элементов в пакете не является идеальной стратегией.Вы можете создавать индексы, сохраняя идентификаторы в наборах , или вы можете хранить элементы в отсортированном наборе со значением, к которому вы можете обращаться, например, по возрастающему идентификатору, например:

var redisEntities = redis.As<BookingRequestModel>();
var bookings = redisEntities.SortedSets["bookings"];

foreach (var item in new BookingRequestModel[0])
{
    redisEntities.AddItemToSortedSet(bookings, item, item.Id);
}

Таким образомвы сможете получать их партиями, например:

var batch = bookings.GetRangeByLowestScore(fromId, toId, skip, take);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...