C# 直接在redis对象上应用分页和排序

C# 直接在redis对象上应用分页和排序,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,我正在使用Redis缓存来存储我的页面数据。我需要在我的页面上显示数据分页(延迟加载)。当记录数量减少时,一切正常。但当它加载超过60k条记录时,速度会大大减慢。我正在使用以下代码获取数据: List<MyEntity> lstMyData = cont.Cache.GetObject<List<MyEntity>>("RedisKeyName") .Where(x => x.Id == Id

我正在使用Redis缓存来存储我的页面数据。我需要在我的页面上显示数据分页(延迟加载)。当记录数量减少时,一切正常。但当它加载超过60k条记录时,速度会大大减慢。我正在使用以下代码获取数据:

List<MyEntity> lstMyData = cont.Cache.GetObject<List<MyEntity>>("RedisKeyName")
                               .Where(x => x.Id == Id || x.Id == 0)
                               .OrderByDescending(x => x.TotalCount)
                               .Skip((page != 0 ? page - 1 : 0) * limit)
                               .Take(limit)
                               .ToList();
List lstMyData=cont.Cache.GetObject(“RedisKeyName”)
其中(x=>x.Id==Id | | x.Id==0)
.OrderByDescending(x=>x.TotalCount)
.Skip((第!=0页?第1页:0)*限制)
.接受(限制)
.ToList();

我需要直接查询Redis对象,而不是每次都获取完整列表,但找不到任何合适的内容。请提前帮助和感谢

您的代码做了太多的工作,例如,迭代列表以获取具有给定id的所有记录(
O(N)
),对结果列表进行排序(
O(Nlog(N))
),以及进行分页工作(
O(N/2)
)。当有太多的记录时,它应该非常慢。您需要重新设计存储数据的方式

使用Redis'
排序集
提高性能

将给定
Id
的所有记录存储在
排序集
,记录的
TotalCount
作为分数

需要获取数据时,可以使用
ZREVRANGE
命令在
O(log(N)+limit)
中执行分页工作,
N
是给定
Id
的记录数。应该快得多

// add records for Id1
zadd Id1 TotalCount1 record1
zadd Id1 TotalCount2 record2
// ...
zadd Id1 TotalCountN recordN
// pagination for the given Id, page (beginning from 1) and limit
zrevrange Id1 (page-1)*limit page*limit-1

您是否将这些记录存储在Redis
列表中
?否,存储在Redis对象中。谢谢您的回答。我已经搜索了排序集,它们很适合分页,但是我可以使用排序集对多个字段进行排序,因为它是按分数排序的吗?@AhmedHassan,因为它是按分数排序的(事实上,如果所有元素都有相同的分数,也可以按字母顺序排序,例如,
zrangebylex
),如果您想对多个字段进行排序,你必须做一些技巧,即用多个字段生成分数。例如,假设您想同时对
A
B
进行排序,并且
B
[0-9]
的范围内,那么您可以生成这样的分数:
A*10+B
。如果不能生成这样的分数,则不能在多个字段上排序。