使用.NET进行Redis优化,以及如何从Hash存储和获取元素的具体示例

问题描述 投票:3回答:1

我有超过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秒钟是巨大的)。

请指教!

c# redis
1个回答
2
投票

首先,你不应该每次都像Redis Client Manager实例一样创建一个新的RedisManagerPool,在你的应用程序中应该只有一个RedisManagerPool的单例实例,所有客户端都是从中解析出来的。

但除此之外我会重新考虑您的数据访问策略,批量下载15K项目并不是一个理想的策略。您可以使用create indexes by storing ids in Sets或者您可以将项目存储在已排序的集合中,其值可以像增量ID一样进行分页,例如:

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);
© www.soinside.com 2019 - 2024. All rights reserved.