我有一个问题 - 在索引中的键值对查找 - 让我们在卡桑德拉或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的是在内存中的存储。 因此,它可以使用,它们适合于存储器存储的数据结构(允许快速随机接入)。
为了实现字典(用于主字典,也用于散列和设置对象,以及与用于zset对象跳跃列表一起),Redis的使用分离链哈希表 ,其访问复杂度为O(1 + N / K),其中n是项数和k桶的数目。
Redis的确保与成长,使得在实践中N / K保持较低的项目数桶的数量。 这种换汤不换药的活动在后台逐步完成。 当项目的数量为显著,复杂度接近O(1)(摊销)。
其他商店(卡桑德拉例如)旨在将数据存储在磁盘上,同时尽量减少随机I的数目/ O的性能的原因。 哈希表是不是一个很好的数据结构,因为它不执行数据的地方(它不从缓冲区高速缓存中受益非常好)。 因此,基于磁盘的存储通常使用的B-tree的变体(多数RDBMS)或日志结构合并(LSM)树变种(卡桑德拉),其中有O(log n)的复杂性。
所以,是的,Redis的许多操作提供了O(1),但有一个限制:所有数据应该适合在内存中。 这里没有魔法。