Tendis icon indicating copy to clipboard operation
Tendis copied to clipboard

set的smembers性能提升

Open sydnash opened this issue 3 years ago • 4 comments

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带来的存储优势。

sydnash avatar Jan 25 '22 07:01 sydnash

这个项目看起来已经没有维护了。。

ZoidbergPi avatar Mar 25 '22 09:03 ZoidbergPi

关于sismember命令,可以参考src/tendisplus/commands/set.cpp,sismember的实现是一个O(1)的过程,并没有使用到迭代器,所以应该不存在你描述的问题。

能否能具体的描述一下问题呢。比如使用到的tendis版本,和复现步骤。

raffertyyu avatar May 24 '22 08:05 raffertyyu

关于sismember命令,可以参考src/tendisplus/commands/set.cpp,sismember的实现是一个O(1)的过程,并没有使用到迭代器,所以应该不存在你描述的问题。

能否能具体的描述一下问题呢。比如使用到的tendis版本,和复现步骤。 image

sorry,描述错了,是smembers,这个会依赖rocksdb的iterator去遍历set的所有元素。

sydnash avatar May 29 '22 07:05 sydnash

优化这个命令的需求是否很大,成本是否值得。您的使用场景是怎么样的呢,为什么会需要频繁的执行smembers呢。能简单描述一下吗,特殊应用场景可能得考虑其他的优化途径。

raffertyyu avatar Jul 04 '22 08:07 raffertyyu