我对NoSQL很新,但我总是喜欢它的想法。我查看了Redis,并对存储和接收多个hashes
的最佳方式提出了一些问题。
假设以下情况:
Store a list of objects (redis 'Hashes') and select them by their timestamp.
要在SQL
中归档此内容,需要一个表和两个简单查询(INSERT& SELECT)。
尝试在Redis
中执行此操作,我最终创建了以下结构:
object:$id
的钥匙object
(hash) index:timestamp:$id
(sorted set)
score
等于timestamp
而value
包括id
虽然我可以使用两个键而不是一个表( SQL )的额外维护工作,但我很好奇选择多个对象的过程:
ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd
这会返回在array
和timestampStart
之间创建的所有ID的timestampEnd
。为了获得对象本身,我通过以下方式请求每一个:
GET object:$id
GET
s的数量很多而变得更慢?答案 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 json
,score = timestamp
。这样可以为您的操作节省O(M)
,无需执行任何GET
。
这是否是一种好的做事方式取决于您的使用案例。您真正需要多少速度,传统数据库的其他功能对您有多重要?请记住,Redis不仅仅是客户端可访问的数据结构,而是传统数据库,它必须将所有内容存储在RAM中。要知道这对你是否合适,我们需要更多信息。