我有超过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秒钟是巨大的)。
请指教!
首先,你不应该每次都像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);