3

我对 NoSQL 很陌生,但我一直很喜欢它的想法。我查看了Redis,并收到了一些关于存储和接收多个hashes.

假设以下场景:

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

要将其存档SQL,需要一个表和两个简单​​查询(INSERT 和 SELECT)。

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

  1. 包含object:$id _ _object
  2. index:timestamp:$id (排序集) score等于timestampvalue包含id

虽然我可以忍受两个键而不是一个表 ( SQL ) 的额外维护工作,但我对选择多个对象的过程感到好奇:

ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd

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

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

1 回答 1

3

AZRANGEBYSCORE成本O(log(N) + M)whereN=|items in your set|M=|items you're selecting|。因此,执行ZRANGEBYSCORE然后 MGET操作只是O(long(N)+M+M)=O(log(N)+M)并且最多会慢两倍。网络来回可能会大大减慢速度,但是由于您的每次获取都是独立的操作,因此您可以将它们流水线化。你也可以把整个东西放在一个 Lua 脚本中,然后只用一个来回,这将是最优化的。我有 99% 的把握说这比在 SQL 中做同样的事情要快。

此外,如果这对您来说是一个非常频繁的操作,您可以通过将整个对象存储在排序集中而不是仅存储 id 来获得更快的速度。你会有key = object encoded as json, score = timestamp. O(M)就不需要执行任何操作而言,这将为您节省操作GET

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

于 2013-06-02T20:51:12.713 回答