如何在Redis中存储简单数组

Jan*_*čič 5 php redis

我想知道在Redis中存储IP(不是很多(<50))以及一些元数据(时间添加,注意)的最佳方式是什么。我需要能够快速确定某个 IP 是否在该列表中,并能够检索所有存储的 IP。

我有一些想法,但对我来说它们似乎并不优雅/高效:

  • 使用列表存储 IP,其中每个条目都是数组(ip、note、timestamp)。这将使检索所有 IP 变得简单,但需要循环遍历所有 IP,以确定给定 IP 是否在列表中。所以这对检索所有 IP 很好,但对于检查一个 IP 是否存在则不太好。
  • 使用哈希表存储 IP,其中 IP 是键的一部分,元数据是哈希中的字段。这将允许我检查 IP 是否存储得非常简单(exists()),但需要一个单独的 redis 列表来跟踪存储的 IP(这需要我在添加/删除 IP 时非常小心)并且我必须执行 1 + count(ips) 次操作才能获取所有存储的 IP 及其元信息。所以这种方式有利于检查一个IP是否存在,但不利于检索所有IP。

有没有其他方法可以用 redis 做到这一点,还是我必须使用上述方法之一(如果是这样,哪一个是最好的)?

小智 5

对于您的数据大小,这并不重要。

但是这个黑客怎么样。使用分数作为 IP 的有序集(将其视为一个数字,每个周期被视为 00,例如 127.0.0.1 => 1270000001),每个项目都是元数据和 JSON 中的 IP

zadd ip_set 1270000001 '{ip:"127.0.0.1", note:"blah"}
Run Code Online (Sandbox Code Playgroud)

然后得到你所做的一切

zrange ip_set 0 -1
Run Code Online (Sandbox Code Playgroud)

并检查是否存在

zcount ip_set 1270000001
Run Code Online (Sandbox Code Playgroud)