C# 直接在redis对象上应用分页和排序
我正在使用Redis缓存来存储我的页面数据。我需要在我的页面上显示数据分页(延迟加载)。当记录数量减少时,一切正常。但当它加载超过60k条记录时,速度会大大减慢。我正在使用以下代码获取数据: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
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
。如果不能生成这样的分数,则不能在多个字段上排序。