Hash Redis-超大单记录(哈希表)
我们在这里有一个巨大的争议: 我们在服务器上安装了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专家的回应,指出该方法中的错误,或者证明我是错的。首先,让我们澄清一点——两者都是O(1)操作。两者之间没有时间复杂度的差异 接下来要考虑的是以后如何划分键空间。比如说,您的增长呈爆炸式增长,您需要以某种方式进行集群(企业、OSS或其他)。在所有这些实现中,都不能拆分密钥。因此,如果您有一个名为
users
的散列,那么一个表示用户ID的字段,正如您所提到的,该散列将变得非常大,并且不容易扩展
更好的方法是将用户划分为子散列。假设您的用户ID如下所示:1234
,那么您要做的是创建一个哈希user:12
和一个34
字段,用于存储用户1234
的数据(HGET user:12 34
)。这样,您可以节省密钥空间开销,并且仍然能够对密钥空间进行分区。该文件概述了这一策略
就您的数据而言,您可以进行某种序列化并将所有内容存储在一个字段(JSON、CSV等)中,也可以对每个用户的每个数据段使用哈希,并且仍然使用分区(例如,key
user:name:12
/field34
和user:age:12
/field34
).我想你一定搞错了-重点是关于表(与用户属性无关-我提到用户属性只是为了表明Redis将保留与表无关的其他属性)。问题是关于表的-将整个表放在一个Redis记录中是否合乎逻辑-表会随着时间的推移而增长,这听起来像是一种糟糕的做法…访问表中所需的行-它不会检索整个表然后访问它吗(是的,它是o(1),但在大量内存使用之后…?@Eking Redis没有“表”的概念它是Redis数据模型的重要概念部分。如上所述,为了分区和集群的目的,使用一个巨键是一种不好的做法,但在其他方面,大小实际上是不相关的。就时间复杂度而言,哈希的大小与时间无关。它在内部都是指针,所以如果您只请求一个字段,Redis实际上不会处理散列的其余部分。O(1)是O(1)。多个键而不是散列中的多个字段是可以的,但是键空间会产生存储开销-但它仍然是O(1)。正如我所提到的,在Redis中检索(和设置)值的操作是O(1)。Eking我读了你的评论好几次,很难理解你想做什么。也许你想做些什么?您的引用“表”/“行”/“搜索”/“记录”,这似乎对您的提问很重要,但它们不是Redis中的概念,因此很难理解您的意思。也许你想做些什么?