Tencent / Tendis

Tendis is a high-performance distributed storage system fully compatible with the Redis protocol.
http://tendis.cn
Other
2.87k stars 317 forks source link

set的smembers性能提升 #177

Open sydnash opened 2 years ago

sydnash commented 2 years ago

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节点。

ZoidbergPi commented 2 years ago

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

raffertyyu commented 2 years ago

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

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

sydnash commented 2 years ago

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

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

image

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

raffertyyu commented 2 years ago

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