我在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秒,这是巨大的)。
请咨询!
答案 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);