【问题标题】:How to store simple arrays in Redis如何在 Redis 中存储简单的数组
【发布时间】:2012-04-25 20:51:33
【问题描述】:

我想知道在 Redis 中存储 IP(不是很多 (

我有一些想法,但在我看来它们并不优雅/高效:

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

是否有其他方法可以使用 redis 执行此操作,或者我是否必须使用上述方法之一(如果有,哪种方法最好)?

【问题讨论】:

    标签: php redis


    【解决方案1】:

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

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

    zadd ip_set 1270000001 '{ip:"127.0.0.1", note:"blah"}
    

    然后得到你所做的一切

    zrange ip_set 0 -1
    

    并检查是否存在

    zcount ip_set 1270000001
    

    【讨论】:

    • 嗯,这听起来很有趣,我会测试它并告诉你(明天可能:))。
    • @JanHančič,明天会来来去去。 :-)
    【解决方案2】:

    当然是第二种方式。这是一个键值存储。您应该完全按照您的描述使用密钥。 Redis 执行操作非常快。不用担心1-2次操作。

    【讨论】:

    • 假设我存储了 50 个 IP(使用第二种方法),即 50 个哈希和 1 个列表。因此,要显示所有 IP,我需要先获取列表,然后再执行 50 个“hGetAll”来获取实际值(无法通过一个命令获取多个哈希值)。这对我来说听起来不对:)
    • 您可以将值存储为序列化字符串。因此,将允许多次获取。
    猜你喜欢
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多