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

讨论下是否还需要zset.score的设计 #14

Open
lizijie opened this issue Oct 22, 2022 · 3 comments
Open

讨论下是否还需要zset.score的设计 #14

lizijie opened this issue Oct 22, 2022 · 3 comments

Comments

@lizijie
Copy link

lizijie commented Oct 22, 2022

大多数编程语言本身都提供数组类型,并且可以自定义排序。以lua为例

local list = { {name="a", count=1}, {name="b", count=2 }
table.sort(list, function(a, b)
    if a.count ~= b.count then
         return a.count < b.count
    else
         return a.name < b.name
    end
    return false
end)

自定义排序,是为了方便调用端,做复杂的排序比较(复合排序)

redis zset为什么通过score定义排序?按我个人理解,这是为了将多维条件转换成一维条件,去隔离调用端各种乱七八槽的关系,如redis需要支持脚本化编程、两钟语言间据结构转换

谈回贵项目,是想在本地lua环境中提供zsert支持。那么将多维条件转换成一维条件就没必要了,lua业务层不需要老是想着如何转换成一维比较。比较函数可以在zsert.new时定义

local zs = zset.new(function(a, b)
    -- todo someting here
end)
@hanxi
Copy link
Contributor

hanxi commented Oct 22, 2022

我猜测是效率问题,每对比一次要调用一次lua函数。可以写个 benchmark 对比一下试试?

@lizijie
Copy link
Author

lizijie commented Oct 22, 2022

我猜测是效率问题,每对比一次要调用一次lua函数。可以写个 benchmark 对比一下试试?

以上只是初步构想并未实现。如果差别不大,或只是稍微高一丢丢,应该还可以接受。
可以的,我之后可以尝试实现并对比一下。

@xjdrew
Copy link
Owner

xjdrew commented Feb 23, 2023

底层是跳表,排序是在c层实现的,如果通过回调函数支持自定义排序,性能会降低比较多;

这个数据结构本身不是那么通用的,适合用来做排行榜之类,有score的场景。

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

3 participants