c# - 直接对redis对象应用分页和排序

标签 c# redis stackexchange.redis

我正在使用 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/

相关文章:

c# - 连续读取 CF 上的多个 TCP 连接

php - Laravel 5.1 队列作业 $this->delete() 不工作

Aerospike 的 Redis 桌面管理器?

redis - 如何使用 StackExchange.Redis 将 Redis 键作为整数插入

Redis 键空间通知 - 订阅者数量与争用

redis - 如何使用 StackExchange.Redis 删除与指定键模式匹配的所有键?

c# - 为什么 CTRL-D 不以单声道发送 EOF?

c# - 在 Cmdlet 中,如何检测是否设置了调试标志?

c# - Request.Url.Port 给出了错误的端口

redis - 使用 docker swarm 在多节点 Python celery 应用程序中使用 Redis 队列