Tendis
Tendis copied to clipboard
set的smembers性能提升
Description
之前我们在使用set的时候,出现过smembers命令导致tendis数据库变慢,最终无法提供正常服务的问题。 看了下代码发现smembers依赖于rocksdb的Iterator功能,在set的量比较大的时候可能导致性能问题。
Expected Behavior
期望解决smembers的性能问题。
Possible Solution
修改set的实现,增加一个双向链表来记录set里面的元素的key(这里类似使用一个额外的skiplist来记录zset的key一样。),并把链表的node记录到rocksdb,并且在 并在metadata里面记录head和teil的list节点。
- 插入节点: 需要多一步操作:在tail或者head出插入node
- 删除节点: 需要取出删除节点的前后节点,修改其pre和forwad指针。
- smembers:遍历链表
- 删除:需要清楚链表节点
- 其余命令应该不需要变化无变化。
Context
目前我们set相关的数据,都又重新迁回了redis,无法使用tendis带来的存储优势。
这个项目看起来已经没有维护了。。
关于sismember命令,可以参考src/tendisplus/commands/set.cpp,sismember的实现是一个O(1)的过程,并没有使用到迭代器,所以应该不存在你描述的问题。
能否能具体的描述一下问题呢。比如使用到的tendis版本,和复现步骤。
关于sismember命令,可以参考src/tendisplus/commands/set.cpp,sismember的实现是一个O(1)的过程,并没有使用到迭代器,所以应该不存在你描述的问题。
能否能具体的描述一下问题呢。比如使用到的tendis版本,和复现步骤。
sorry,描述错了,是smembers,这个会依赖rocksdb的iterator去遍历set的所有元素。
优化这个命令的需求是否很大,成本是否值得。您的使用场景是怎么样的呢,为什么会需要频繁的执行smembers呢。能简单描述一下吗,特殊应用场景可能得考虑其他的优化途径。