Redis GET与SQL SELECT

时间:2013-06-02 19:43:14

标签: nosql redis

我对NoSQL很新,但我总是喜欢它的想法。我查看了Redis,并对存储和接收多个hashes的最佳方式提出了一些问题。

假设以下情况:

Store a list of objects (redis 'Hashes') and select them by their timestamp.

要在SQL中归档此内容,需要一个表和两个简单​​查询(INSERT& SELECT)。

尝试在Redis中执行此操作,我最终创建了以下结构:

  1. 包含object:$id 的钥匙object (hash)
  2. index:timestamp:$id (sorted set) score等于timestampvalue包括id
  3. 虽然我可以使用两个键而不是一个表( SQL )的额外维护工作,但我很好奇选择多个对象的过程:

    ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd
    

    这会返回在arraytimestampStart之间创建的所有ID的timestampEnd。为了获得对象本身,我通过以下方式请求每一个:

    GET object:$id 
    
    • 这是正确的做法吗?
    • 与SQL数据库相比:它是否仍然明显更快,或者由于GET s的数量很多而变得更慢?

1 个答案:

答案 0 :(得分:3)

ZRANGEBYSCORE费用O(log(N) + M) N=|items in your set|M=|items you're selecting|。因此,执行ZRANGEBYSCORE和M GET操作只是O(long(N)+M+M) = O(log(N)+M),最多只会慢两倍。网络来回可能是一个主要的减速,但由于你的每个获取是一个独立的操作,你可以只管道它们。你也可以将整个东西放在一个Lua脚本中,然后只来回一个,这将是最优的。我会说99%的确定性,这比在SQL中做同样的事情要快。

此外,如果这是一个非常频繁的操作,只需将整个对象存储在已排序的集合而不仅仅是id中,您就可以获得更快的速度。您有key = object encoded as jsonscore = timestamp。这样可以为您的操作节省O(M),无需执行任何GET

这是否是一种好的做事方式取决于您的使用案例。您真正需要多少速度,传统数据库的其他功能对您有多重要?请记住,Redis不仅仅是客户端可访问的数据结构,而是传统数据库,它必须将所有内容存储在RAM中。要知道这对你是否合适,我们需要更多信息。