我正在使用 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();
我需要直接查询 Redis 对象而不是每次都获取完整列表,但找不到合适的东西。请帮助并提前致谢。
最佳答案
您的代码做了太多工作,例如迭代列表以获取具有给定 id 的所有记录 (O(N)
),对结果列表进行排序 (O(Nlog(N))
),然后进行分页工作(O(N/2)
平均)。当记录太多时,应该会很慢。您需要重新设计存储数据的方式。
Use Redis'
SORTED SET
to improve the performance.
将给定Id
的所有记录存储在SORTED SET
中,记录的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
关于c# - 直接对redis对象应用分页和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40189880/