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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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
Hash Redis-超大单记录(哈希表)_Hash_Redis_Time Complexity_Hashtable - Fatal编程技术网

Hash Redis-超大单记录(哈希表)

Hash Redis-超大单记录(哈希表),hash,redis,time-complexity,hashtable,Hash,Redis,Time Complexity,Hashtable,我们在这里有一个巨大的争议: 我们在服务器上安装了Redis,希望在其中保存几种类型的数据: 一些零星变量(针对每个用户-因此不只是少数记录) 一个非常大的表将随时间增长 争议在于如何保存所提及的表格 我们都知道Redis GET的时间复杂度是O(1)-因此我们可以将表中的每条记录存储为Redis中的一条记录(使用一些前缀来知道它是该表行) 或 我们可以在Redis中将该表作为一条记录存储为散列,然后访问我们想要在散列中存储的行,这是两个O(1)步骤 我认为,Redis内部不断增长的巨大单记录是

我们在这里有一个巨大的争议:

我们在服务器上安装了Redis,希望在其中保存几种类型的数据:

  • 一些零星变量(针对每个用户-因此不只是少数记录)
  • 一个非常大的表将随时间增长
  • 争议在于如何保存所提及的表格

    我们都知道Redis GET的时间复杂度是O(1)-因此我们可以将表中的每条记录存储为Redis中的一条记录(使用一些前缀来知道它是该表行)

    我们可以在Redis中将该表作为一条记录存储为散列,然后访问我们想要在散列中存储的行,这是两个O(1)步骤


    我认为,Redis内部不断增长的巨大单记录是灾难性的,但我需要的不仅仅是我的意见——我需要Redis专家的回应,指出该方法中的错误,或者证明我是错的。

    首先,让我们澄清一点——两者都是O(1)操作。两者之间没有时间复杂度的差异

    接下来要考虑的是以后如何划分键空间。比如说,您的增长呈爆炸式增长,您需要以某种方式进行集群(企业、OSS或其他)。在所有这些实现中,都不能拆分密钥。因此,如果您有一个名为
    users
    的散列,那么一个表示用户ID的字段,正如您所提到的,该散列将变得非常大,并且不容易扩展

    更好的方法是将用户划分为子散列。假设您的用户ID如下所示:
    1234
    ,那么您要做的是创建一个哈希
    user:12
    和一个
    34
    字段,用于存储用户
    1234
    的数据(
    HGET user:12 34
    )。这样,您可以节省密钥空间开销,并且仍然能够对密钥空间进行分区。该文件概述了这一策略


    就您的数据而言,您可以进行某种序列化并将所有内容存储在一个字段(JSON、CSV等)中,也可以对每个用户的每个数据段使用哈希,并且仍然使用分区(例如,key
    user:name:12
    /field
    34
    user:age:12
    /field
    34
    ).

    我想你一定搞错了-重点是关于表(与用户属性无关-我提到用户属性只是为了表明Redis将保留与表无关的其他属性)。问题是关于表的-将整个表放在一个Redis记录中是否合乎逻辑-表会随着时间的推移而增长,这听起来像是一种糟糕的做法…访问表中所需的行-它不会检索整个表然后访问它吗(是的,它是o(1),但在大量内存使用之后…?@Eking Redis没有“表”的概念它是Redis数据模型的重要概念部分。如上所述,为了分区和集群的目的,使用一个巨键是一种不好的做法,但在其他方面,大小实际上是不相关的。就时间复杂度而言,哈希的大小与时间无关。它在内部都是指针,所以如果您只请求一个字段,Redis实际上不会处理散列的其余部分。O(1)是O(1)。多个键而不是散列中的多个字段是可以的,但是键空间会产生存储开销-但它仍然是O(1)。正如我所提到的,在Redis中检索(和设置)值的操作是O(1)。Eking我读了你的评论好几次,很难理解你想做什么。也许你想做些什么?您的引用“表”/“行”/“搜索”/“记录”,这似乎对您的提问很重要,但它们不是Redis中的概念,因此很难理解您的意思。也许你想做些什么?