redis是如何为密钥查找声明O(1)时间的?

redis是如何为密钥查找声明O(1)时间的?,redis,time-complexity,Redis,Time Complexity,我有一个问题-在索引中查找键值对-比如在cassandra或postgres上-通常在O(logn)左右 来源: 在redis文档中,它声明运行时复杂性为O(1) 资料来源: 获取多个键的值只是线性的O(m),其中m是检索到的键的数量 怎么可能呢?Redis是一种内存存储。因此,它可以使用适合于内存存储的数据结构(允许快速随机访问) 为了实现字典(用于主字典,但也用于散列和集合对象,并与zset对象的跳过列表结合使用),Redis使用,其访问复杂度为O(1+n/k),其中n是项目数,k是存储

我有一个问题-在索引中查找键值对-比如在cassandra或postgres上-通常在O(logn)左右

来源:

在redis文档中,它声明运行时复杂性为O(1)

资料来源:

获取多个键的值只是线性的O(m),其中m是检索到的键的数量


怎么可能呢?

Redis是一种内存存储。因此,它可以使用适合于内存存储的数据结构(允许快速随机访问)

为了实现字典(用于主字典,但也用于散列和集合对象,并与zset对象的跳过列表结合使用),Redis使用,其访问复杂度为O(1+n/k),其中n是项目数,k是存储桶数

Redis确保存储桶的数量随着项目数量的增加而增加,因此实际上n/k保持在较低的水平。此重新灰化活动是在后台增量完成的。当项目数量较大时,复杂性接近O(1)(摊销)

其他存储(例如Cassandra)设计用于将数据存储在磁盘上,同时出于性能原因尽量减少随机I/O的数量。哈希表不是一个很好的数据结构,因为它不能强制执行数据的局部性(它不能很好地从缓冲区缓存中获益)。因此,基于磁盘的存储通常使用B树变体(大多数RDBMS)或日志结构合并(LSM)树变体(Cassandra),它们具有O(logn)复杂性


是的,Redis为许多操作提供了O(1),但有一个限制:所有数据都应该放在内存中。这里没有魔法。

水桶是什么意思?它是一个单独的“数据库”吗?(看起来是反模式的)还是单独的实例(进程)?还是别的什么?@Kunok不,不是这样的。只是一个哈希表条目。想知道“项数”是指每个bucket的平均数,还是指所有bucket上的所有项。它指字典中的所有项。