一尘不染

Redis GET与SQL SELECT

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
  2. index:timestamp:$id (排序集) score 等于timestampvalue包括id

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

ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd

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

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

阅读 272

收藏
2020-06-20

共1个答案

一尘不染

一个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中。要知道这是否适合您,我们需要更多信息。

2020-06-20