redis如何申请O(1)时间进行密钥查找?

时间:2013-03-05 06:03:48

标签: redis time-complexity

我有一个问题 - 在索引中查找键值对 - 比方说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

怎么可能?

1 个答案:

答案 0 :(得分:57)

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

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

Redis确保桶的数量随着项目数量的增长而增加,因此实际上n / k保持较低。这种重复活动在后台逐步完成。当项目数量很大时,复杂性接近于O(1)(摊销)。

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

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