Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nosql Redis GET与SQL SELECT_Nosql_Redis - Fatal编程技术网

Nosql Redis GET与SQL SELECT

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 虽然

我对NoSQL很陌生,但我一直喜欢它的想法。我看了一下,问了一些关于存储和接收多个
哈希值的最佳方法的问题

假设出现以下情况:

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,它是否仍然明显更快,或者甚至可能变得更慢

    A
    ZRANGEBYSCORE
    成本
    O(log(N)+M)
    其中
    N=|您集合中的项目
    M=|您选择的项目
    。因此,执行
    ZRANGEBYSCORE
    和M
    GET
    操作就是
    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无法在它们之间链接!?我以为你只是在用一个时间戳索引。是的,如果有很多索引,它将使用更多的空间。额外的空间是否值得进行速度权衡实际上取决于您的用例。