Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用rocksdb模拟实现redis zset的时间复杂度是否一样呢? #19

Open
mars00772 opened this issue Dec 17, 2018 · 4 comments
Open

Comments

@mars00772
Copy link

hi,感谢开源!我在文档找了下关于数据结构映射的文档,没有太详细的说明,曾经关注在rocksdb模拟redis跳表的实现,特别是rev 相关的命令,如: zrevrange、zrevrank、zrevrangebyscore。这些接口在既有的开源项目中实现的非常不理想,毕竟,leveldb的反向迭代器也是比正向慢多了,虽然官网只是提到一句:
image
我在另个实现中测试了其普通zrange的实现,大概1亿条数据,后来看到其实现是靠正向遍历:
image
这是完全不能用于生产环境的实现!
所以,zanRedisDB能否说明下一些操作的时间复杂度以及实现呢?

@mars00772
Copy link
Author

看起来在rocksdb上实现zset函数有本质困难,zanRedisDB直接限制zset 大小10240个members了。

@absolute8511
Copy link

没有限制member个数, 10240限制的是单个member的长度. 复杂度上面, zrange这种正向range比较快, 反向revrange这种会比较慢, 受限于底层db的反向迭代性能, 你可以测试下看看是否满足你的要求. 另外还是不建议这种特别多的member. 最好还是百万以内.

@mars00772
Copy link
Author

看起来zrange,revrange操作还是O(N)实现(redis是O(logN)),对于这块优化,是否有计划或策略呢

@absolute8511
Copy link

absolute8511 commented Dec 18, 2018

深翻页用zrangebyscore, ZRANGEBYLEX会更快. zrange你那个测试用法相当于深翻页了. 你一个zset里面放这么多members, 几个不同的大zset加起来 redis内存也抗不住啊.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants