.NET的Redis优化,以及如何从哈希中存储和获取元素的具体示例

时间:2019-04-10 07:59:40

标签: c# redis

我在Redis列表中存储了超过15000个POCO元素。我使用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 个答案:

答案 0 :(得分:2)

首先,您不应该每次都创建一个像RedisManagerPool这样的新Redis Client Manager实例,在您的应用中应该只有一个RedisManagerPool的单例实例可以解决所有客户端问题。

但是,否则我会重新考虑您的数据访问策略,批量下载15,000个项目不是理想的策略。您可以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);