【问题标题】:How does redis claim O(1) time for key lookup?redis 如何要求 O(1) 时间进行键查找?
【发布时间】:2013-02-19 10:43:03
【问题描述】:

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

来源:https://github.com/tinkerpop/blueprints/wiki/Graph-Indices。

在 redis 文档中,它指出运行时复杂度为 O(1)。

来源:http://redis.io/commands/get http://redis.io/commands/hget

并且获取多个键的值只是线性 O(m),其中 m 是检索到的键的数量 http://redis.io/commands/hmget

这怎么可能?

【问题讨论】:

    标签: redis time-complexity


    【解决方案1】:

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

    为了实现字典(用于主字典,也用于hash和set对象,并结合zset对象的skip list),Redis使用separate chaining hash tables,其访问复杂度为O(1+n/k ) 其中 n 是项目数,k 是桶数。

    Redis 确保桶的数量随着项目的数量而增长,因此在实践中 n/k 保持在较低水平。这种重新散列活动是在后台逐步完成的。当项目数量很大时,复杂度接近 O(1)(摊销)。

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

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

    【讨论】:

    • 桶是什么意思?它是一个单独的“数据库”吗? (这似乎是反模式)还是单独的实例(进程)?还是别的什么?
    • @Kunok 不,没什么。只是一个哈希表条目。
    • 想知道“项目数”是指每个桶的平均数,还是所有桶中的 所有 个项目。
    • 表示字典的所有项目。
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2015-05-08
    • 2018-07-14
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多