【问题标题】:Redis - Best data structure to store and then fetch large dataRedis - 存储然后获取大数据的最佳数据结构
【发布时间】:2019-05-04 21:40:39
【问题描述】:

我最近在我的一个 Laravel 项目中实现了 Redis。目前它更像是一种技术练习,而不是生产,因为我想看看它的能力。

我所做的是创建了一个付款交易列表。我要推送到列表中的是每次处理事务时我从 webhook 收到的有效负载。有效负载本质上是一个对象,其中包含与该特定事务有关的所有信息。

我创建了一个 VueJS 前端,然后在表格中显示所有数据并具有分页功能,因此一次显示 10 行。

最初这工作非常快,但现在列表包含 30,000 行,大约 11MB 的数据,请求大约需要 11 秒。

我认为这里的问题是我正在使用一个列表并使用 LRANGE 从列表中获取所有行。

我使用列表的原因是因为它有 LPUSH 命令,以便最新的事务转到列表的开头。

我决定做一个测试,从列表中获取所有数据并将值输出到空白页,这花费了大约相同的时间,所以这不是 Vue、Axios 等的问题。

首先,这个读取速度正常吗?我一直听说 Redis 非常快。

其次,在使用 Redis 时有没有更好的方法来提高读取性能?

第三,我是否使用了错误的数据类型?

我需要能够存储 1m 行数据。

【问题讨论】:

  • 请使用国际公认的 SI 单位前缀。 MB=megabyte en.m.wikipedia.org/wiki/Megabytemb=millibit en.m.wikipedia.org/wiki/Megabit
  • @MarkSetchell 毫比特不存在。 [Bit (b)](https://en.wikipedia.org/wiki/Bit) 是最小的基本度量,您不能将位划分为较小的部分。
  • @Tpojka 我就是这么说的。 mb 一词在原始帖子中使用,我是说 mmilli 的 SI 前缀,b 是位的 SI 单位,因此它将指定毫位 - 无论这样的东西是否存在或不是。
  • 我没有太多使用 Redis 的经验,但是您可以查看现有的软件包以及它们是如何做到的。例如,Horizo​​n 似乎对有效负载使用哈希图,对具有 TTL 的键使用排序集。查看他们的RedisJobRepository。即使有很多元素(100k+),感觉也很快(

标签: php laravel redis


【解决方案1】:

我意识到您可以在任何事务更新中获得所有 30,000 行,然后在前端对其进行分页。在我看来,真正的策略是在每个请求中获得更轻的数据包。 例如,使用 Laravel 分页来响应您的请求。

【讨论】:

    【解决方案2】:

    在我看来:

    • 首先:如您所知,Redis 非常快,Redis 非常快。因为 Redis 数据一直在内存中,你说读取 11MB 数据大约使用 11s,你可以检查你的带宽
    • 其次:对不起,我不知道如何在这个环境中增加。
    • 第三:我觉得你的选择没问题。

    所以,你可以先检查你的带宽(redis 服务器)。

    【讨论】:

    • 你说:'最初它工作得非常快,但现在列表包含 30,000 行,大约 11mb 的数据,请求大约需要 11 秒。而我想知道11s是读取30000行数据还是10行数据?
    • 当我有大约 5000 行数据时它工作得很快,但现在从 Redis 中提取所有 30,000 行需要 11 秒。这 10 行正是 VueJS 前端显示的内容。该表具有分页功能,因此您可以一次浏览所有数据 10 行。我只是不想让人们认为我试图一次显示 30k 行。
    • @Dally 您是否使用 LRANGE 命令一次获取 30000 行数据?如果属实,我认为您可以使用 LLEN 获取数据计数并一次获取 10 行数据。
    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多