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

feat<priority_cache> 使用skipList替代priorityQueue作为RBTreePriorityCache的数据结构 #35

Closed
wants to merge 5 commits into from

Conversation

XiaKuan
Copy link
Contributor

@XiaKuan XiaKuan commented Jul 17, 2024

first step solve this issue
#29

@flycash
Copy link
Contributor

flycash commented Jul 17, 2024

为什么要换?

@XiaKuan
Copy link
Contributor Author

XiaKuan commented Jul 17, 2024

为什么要换?

参考#29 讨论的,想支持对于优先级的动态更新,跳表对于删除节点和更新权重更友好

@flycash
Copy link
Contributor

flycash commented Jul 20, 2024

有两个原因我觉得换实现的话,不是很好:

  • 从命名上来说,我们这个实现的标题上已经写了 RBTree,也就是红黑树了
  • 从实现上来说,红黑树比较简单,但是从性能和稳定性上来说,RBTree 更加好。比如说 SkipList 存在退化的问题,但是红黑树并不会。

因此我还是建议要支持动态调整优先级的话,还是调整红黑树。

你可以试试红黑树里面的旋转,我们的实现里面也有对应的代码,更新了优先级之后,就是重新旋转取得平衡。

@XiaKuan
Copy link
Contributor Author

XiaKuan commented Jul 21, 2024

有两个原因我觉得换实现的话,不是很好:

  • 从命名上来说,我们这个实现的标题上已经写了 RBTree,也就是红黑树了
  • 从实现上来说,红黑树比较简单,但是从性能和稳定性上来说,RBTree 更加好。比如说 SkipList 存在退化的问题,但是红黑树并不会。

因此我还是建议要支持动态调整优先级的话,还是调整红黑树。

你可以试试红黑树里面的旋转,我们的实现里面也有对应的代码,更新了优先级之后,就是重新旋转取得平衡。

感谢回复!
目前看上去k-v的查找还是使用RBTree的,只是修改了存储优先级的数据结构,理解上觉得命名还是合理的

另外如果也使用RBTree作为优先级队列的话。个人觉得使用RBTree更新节点权重的操作,因为会涉及旋转和颜色变换,锁导致的并发性能下滑应该是大于skipList。同时如果使用这个优先级缓存实现lru或者lfu等策略的情形,也会涉及大量的优先级更新情形

所以感觉上就是一个选择了,使用RBTree接收并发能力下滑还是使用skipList接受退化的情形。个人觉得对于缓存这种性能敏感的应用还是比较倾向使用skipList的。WDYT?
@flycash

@XiaKuan XiaKuan closed this Jul 29, 2024
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

Successfully merging this pull request may close these issues.

2 participants