一个基于golang跳表(Skip List)实现的高性能实时排名数据结构。
- 线程安全的操作接口
- 支持泛型,可用于各种可比较的数据类型
- O(log n) 的时间复杂度用于插入、删除和查询操作
- 支持快速的实时排名查询
- 支持相同分数下的二级排序
- 内置键值对字典,提供 O(1) 的键值查找
无论是用于实时排名系统,还是单纯作为高效的 key-value 键值对存储,ranklist 都表现出卓越的性能,轻松实现每秒百万级别的写入与读取操作。
- 写入性能:每秒可处理超过百万级别写入请求。
- 读取性能:每秒读取次数高达千万级别。
- 排名查询:支持实时排名查询,每秒可完成百万级别排名查询。
goos: windows
goarch: amd64
pkg: github.com/werbenhu/ranklist
cpu: AMD Ryzen 5 5600H with Radeon Graphics
BenchmarkRankListSet-12 2792992 396.0 ns/op 288 B/op 1 allocs/op
BenchmarkRankListRandSet-12 1000000 1546 ns/op 311 B/op 1 allocs/op
BenchmarkRankListGet-12 16712578 72.03 ns/op 0 B/op 0 allocs/op
BenchmarkRankListRank-12 6192979 196.8 ns/op 0 B/op 0 allocs/op
BenchmarkRankListRange-12 5647262 183.0 ns/op 496 B/op 5 allocs/op
BenchmarkZSetRandSet-12 1000000 2905 ns/op 167 B/op 3 allocs/op
BenchmarkFastSkipListSet-12 6431894 200.3 ns/op 68 B/op 2 allocs/op
BenchmarkFastSkipListRandSet-12 1000000 1342 ns/op 68 B/op 2 allocs/op
BenchmarkFastSkipListGet-12 12885158 89.49 ns/op 0 B/op 0 allocs/op
BenchmarkMapSet-12 4308596 338.7 ns/op 122 B/op 1 allocs/op
PASS
ok github.com/werbenhu/ranklist 21.948s
package main
import (
"fmt"
"github.com/werbenhu/ranklist"
)
func main() {
// 创建一个新的排行榜,键为字符串,分数为整数。
// 排行榜内部使用跳表实现,以提高排名操作的效率。
r := ranklist.New[string, int]()
// 向排行榜中添加元素及其对应的分数。
// 键 "a"、"b"、"c"、"d" 和 "e" 分别对应分数 1、2、3、4 和 5。
r.Set("a", 1)
r.Set("b", 2)
r.Set("c", 3)
r.Set("d", 4)
r.Set("e", 5)
// 从排行榜中删除键 "e"。
// 如果键存在且删除成功,Del 方法返回 true。
if ok := r.Del("e"); ok {
fmt.Printf("成功删除 'e'\n")
}
// 获取键 "c" 的排名。
// Rank 方法返回键的排名(从 1 开始)以及一个表示操作成功的布尔值。
if rank, ok := r.Rank("c"); ok {
fmt.Printf("'c' 的排名是: %d\n", rank)
}
// 获取键 "d" 的分数。
// Get 方法返回分数以及一个表示操作成功的布尔值。
if score, ok := r.Get("d"); ok {
fmt.Printf("'d' 的分数是: %d\n", score)
}
// 获取排行榜前 3 名的键及其分数。
ranks := r.Range(1, 4)
startRank := 1
for k, v := range ranks {
fmt.Printf("键: %s, 分数: %d, 排名: %d\n", ranks[k].Key, ranks[k].Value, startRank)
startRank++
}
}