gpt4 book ai didi

redis - 从 Redis 读取多个哈希的最快方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 06:05:31 25 4
gpt4 key购买 nike

我有一个 LIST包含指向某些 HASH 的指针数据。就像是:

[LIST] app:1 ["article1", "article2", "article3" ...]
[HASH] article1 {title: "Hello", description: "World"}
[HASH] article2 {title: "Hello", description: "World"}
[HASH] article3 {title: "Hello", description: "World"}

收到此请求后:
api/v1/app/1/articles/20

我执行以下操作:
$pointers = $this->redis->lrange($appID, 0, $request->articles);
$articles = [];

foreach($pointers as $pointer) {
$articles[] = $this->redis->hgetall($pointer);
}

所以我最终得到: 1x lrange打电话,然后 $request->articles金额 hgetall调用。请问什么是最快的解决方案?

我想过:
  • 做HMGET
  • 执行 MULTI/EXEC
  • 使用 LUA 编写此功能并在单个命令中获取它们。

  • 有任何想法吗?

    最佳答案

    如果您只是存储文章数据,我发现您应该将每个文章属性存储在每篇文章的散列中,但您应该构建一个单独的散列,其中键应该是文章标识符,而值应该是 JSON 序列化的对象字符串。

    通常,当您需要访问某个对象的特定属性时,您会使用散列,但我猜您正在获取这些文章是为了将它们列在某些 UI 中,因此没有理由在每篇文章中使用散列。无论如何,每篇文章的散列和所有文章的散列作为 JSON 可以共存:每篇文章的散列如果您需要访问特定的文章属性而不获取整个对象,以及所有文章的散列以获取整个对象对象或列出对象。

    想象一下,使用这种方法可以避免多少次调用 Redis。您从列表中获取所有文章标识符,然后使用单个 hmget命令在一次旅行中获取所有文章。由于您使用的是 lrange , 我知道您不会获得所有文章,但您使用的是分页 .

    您的 API 将所有 JSON 对象作为字符串获取,并将它们直接返回给 API 客户端。

    对您的 API 资源 URI 的一些担忧

    我检查了你的陈述:

    Upon having this request:

    api/v1/app/1/articles/20



    在 REST 中, articles/20我会“通过 id 获取第 20 篇文章”而不是“获取 20 篇文章”。

    让我建议您,我有两种方法可以解决范围问题:
  • 使用查询字符串:api/v1/app/1/articles?startFrom=0&max=20 (参数名称只是我的建议......)。
  • 使用 HTTP header 。您可以随请求一起发送 HTTP header ,例如 MyApi-Range: 0 20 ,其中 0 是起始位置,20 是最大页面大小(即最大结果)。

  • 更新:有关该方法的一些详细信息。

    OP 在一些评论中说:

    We only keep 20 articles at any given time. So when an app pushes a new article, the last one drops from the list and new one gets added to left of list. Then we remove the artice:{ID} hash. With your solution, I need to read the json serial string, remove the article:{ID} property, add the new one, then save it (and override the previous key). Some more work on the backend side. Is there no other way do get those hashes in a faster way apart from keeping them as a json serial? I know LUA could help Redis do it in one command, but I'm not sure if the load on Redis would remain same.



    我的做法是:
  • 文章存储在一个散列中 articles其中键是文章 ID 和值 JSON 序列化的文章对象:

  • [1] => {title: "Hello", description: "World"}
    [2] => {title: "Hello 2", description: "World 2"}
    ....

  • 此外,您应该保持插入顺序在名为 - 例如 - articles:ids 的列表中添加文章 ID。 :

    [1, 2]
  • 当你想存储一篇新文章时,你序列化文章对象并添加到 articles散列使​​用 hset ,然后将文章 ID 添加到 articles:ids列表使用 lpush . 使用 MULTI 执行此操作命令以确保操作以原子方式完成! .
  • 如果想按插入顺序获取文章,需要获取articles:ids文章 ID 和用途 hmget获取所有文章。
  • 当有20篇文章时,正如您在评论中所说的,您需要在articles:id中获取最新的文章ID使用 rpop命令,然后您使用 hdelarticles 中删除文章对象的命令哈希。 使用 MULTI 执行此操作命令以确保操作以原子方式完成! .

  • 更新 2:一些说明

    OP 说:

    How would I retrieve the articles, using HMGET? How well would that hash scale when it contains around a million of keys?



    关于如何使用 hmget 检索文章,这很容易:您获得列表项(可能使用 lrange ),并将所有获得的 id 作为 hmget 的参数提供从散列中获取整篇文章。

    关于使用数百万个键扩展散列的效果,请检查 hget时间复杂度是 O(1)所以这意味着 key 的数量不影响访问时间,而 hmget (因为它是一个散列多次获取)是 O(n)因为访问时间会因获取的 key 数量而增加(而不是存储在散列中的总 key )。

    顺便说一句,由于 Redis 3.x 是黄金版本,而且由于 Redis Cluster,它在可扩展性方面提供了很大的改进。 ,您应该了解有关此新功能的更多信息以及如何 sharding在大数据集的情况下可以提供帮助。

    关于redis - 从 Redis 读取多个哈希的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30460893/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com