我对NoSQL还是很陌生,但是我一直很喜欢它的想法。我看了看Redis,并提出了一些有关存储和接收多个最佳方法的问题hashes。
hashes
假设以下情况:
Store a list of objects (redis 'Hashes') and select them by their timestamp.
要将其归档SQL,需要一个表和两个简单查询(INSERT&SELECT)。
SQL
尝试在中执行此操作Redis,最终创建了以下结构:
Redis
object:$id
object
index:timestamp:$id
score
timestamp
value
id
虽然我可以承担两个键而不是一个表( SQL )的额外维护工作,但我对 选择多个对象 的过程感到好奇:
ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd
这会返回array在timestampStart和之间创建的所有ID中的一个timestampEnd。为了获取对象本身,我通过以下方法请求每个对象:
array
timestampStart
timestampEnd
GET object:$id
GET
一个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中做同样的事情要快。
ZRANGEBYSCORE
O(log(N) + M)
N=|items in your set|
M=|items you're selecting|
O(long(N)+M+M)
O(log(N)+M)
另外,如果这对您来说是非常频繁的操作,则可以通过将整个对象存储在排序集中而不是仅存储id中来提高处理速度。你必须key = object encoded as json,score = timestamp。这样就可以节省您O(M)的操作时间,而无需执行任何操作GET。
key = object encoded as json
score = timestamp
O(M)
这是否是一种好的处理方式,实际上取决于您的用例。您真正需要多少速度?传统数据库的其他功能对您来说有多重要?请记住,与传统数据库相比,Redis不仅仅是客户端可访问的数据结构,而且它必须将所有内容存储在RAM中。要知道这是否适合您,我们需要更多信息。