Nosql Redis GET与SQL SELECT
我对NoSQL很陌生,但我一直喜欢它的想法。我看了一下,问了一些关于存储和接收多个Nosql Redis GET与SQL SELECT,nosql,redis,Nosql,Redis,我对NoSQL很陌生,但我一直喜欢它的想法。我看了一下,问了一些关于存储和接收多个哈希值的最佳方法的问题 假设出现以下情况: Store a list of objects (redis 'Hashes') and select them by their timestamp. 要在SQL中存档,需要一个表和两个简单查询(插入和选择) 尝试在Redis中执行此操作时,我最终创建了以下结构: 包含对象的键:$id 键索引:时间戳:$id score等于timestamp和value包括id 虽然
哈希值的最佳方法的问题
假设出现以下情况:
Store a list of objects (redis 'Hashes') and select them by their timestamp.
要在SQL
中存档,需要一个表和两个简单查询(插入和选择)
尝试在Redis中执行此操作时,我最终创建了以下结构:
包含对象的键:$id
键索引:时间戳:$id
score
等于timestamp
和value
包括id
虽然我可以接受两个键而不是一个表(SQL)的额外维护工作,但我对选择多个对象的过程感到好奇:
ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd
这将返回在timestampStart
和timestampEnd
之间创建的所有ID的数组。要获取对象本身,我要求每个对象:
GET object:$id
- 这样做对吗
- 与SQL数据库相比:由于大量的
GET
s,它是否仍然明显更快,或者甚至可能变得更慢
AZRANGEBYSCORE
成本O(log(N)+M)
其中N=|您集合中的项目
和M=|您选择的项目
。因此,执行ZRANGEBYSCORE
和MGET
操作就是O(long(N)+M+M)
=O(log(N)+M)
,速度最多是前者的两倍。网络的来回运行可能会大大降低速度,但由于每个GET都是独立的操作,因此您可以通过管道将其传输。您还可以将整个内容放在Lua脚本中,只需来回使用一个脚本,这将是最理想的。我可以99%肯定地说,这比在SQL中做同样的事情要快
此外,如果这对您来说是一个非常频繁的操作,那么只需将整个对象存储在排序集中,而不仅仅是id,就可以获得更快的速度。您可以将key=object编码为json
,score=timestamp
。这将为您的操作节省O(M)
,无需执行任何GET
s操作
这是否是一种好的做事方式实际上取决于您的用例。您真正需要多少速度,以及传统数据库的其他功能对您有多重要?记住,与传统数据库相比,Redis不仅仅是客户端可以访问的数据结构,它必须将所有内容存储在RAM中。要知道它是否适合您,我们需要更多信息。非常感谢您为这个答案所做的工作!你刚刚向我介绍了Lua脚本,所以我会仔细阅读。我还考虑过将整个对象
存储在排序集
中,但话说回来:如果我必须使用多个索引怎么办?据我所知,Redis将使用两倍的空间,因为每个索引将包含整个对象,而Redis无法在它们之间链接!?我以为你只是在用一个时间戳索引。是的,如果有很多索引,它将使用更多的空间。额外的空间是否值得进行速度权衡实际上取决于您的用例。