kzset

package
v0.5.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 11, 2026 License: Apache-2.0 Imports: 3 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type GoZSet

type GoZSet struct {
	// contains filtered or unexported fields
}

GoZSet 是一个高性能、线程安全的有序集合(ZSet)实现。

使用场景: 适用于高频、大吞吐量的物联网/微服务动态白名单控制、动态生命周期监控等场景。

设计原理: 内部通过“哈希表(Map)+ 跳跃表(SkipList)”双轨驱动。 Map 提供 O(1) 的精准反查与去重,SkipList 提供 O(log N) 的时间线自动排序与高效切片。

并发特性: 内部封装了 sync.RWMutex 读写分离锁。 支持全量高频多协程并发无锁读取(RLock),写/删/更新操作彼此互斥(Lock)。

example:

zset := NewGoZSet()
zset.ZAdd("point_A", 1000)
zset.ZAdd("point_B", 2000)
fmt.Println("🟢 方案 3 运行成功!已过期数据:", zset.ZRangeByScore(1500))

func NewGoZSet

func NewGoZSet() *GoZSet

NewGoZSet 用于初始化并返回一个完整的 GoZSet 容器实例。

返回值:

@returns *GoZSet: 初始化完毕的有序集合指针,已内嵌预分配好的内存空间与私有随机源。

使用方法:

zset := NewGoZSet()

func (*GoZSet) ZAdd

func (z *GoZSet) ZAdd(member string, score int64)

ZAdd 往有序集合中添加一个新成员,或者更新一个已存在成员的分数。

参数描述:

@param member (string): 成员的唯一标识标识(例如:测点编码 "NM0001")。保证全局唯一,不可重复。
@param score (int64)  : 该成员绑定的分数权重(例如:未来的绝对过期秒级时间戳 1719912000)。

行为逻辑:

  1. 幂等/更新检查:若 member 已存在且分数相同,直接忽略并返回;若分数不同,则先从底层跳表无脑剥离旧节点,再执行新数据插入。
  2. 排序构建:新节点在底层通过多层级联指针搜索,耗时 O(log N) 自动降落到有序铁轨的正确坑位中。

注意事项:

此函数内部会上【写锁】,多个协程同时触发 ZAdd 时会发生微秒级排队,属于正常并发保护。

使用方法:

zset.ZAdd("point_A", time.Now().Add(10 * time.Minute).Unix())

func (*GoZSet) ZRangeByScore

func (z *GoZSet) ZRangeByScore(maxScore int64) []string

ZRangeByScore 获取所有分数小于或等于指定最大分数的成员名单(用于提取已到期数据)。

参数描述:

@param maxScore (int64): 查询分数的临界上限(在白名单场景下,通常传入当前系统的时间戳 UnixTime)。

返回值:

@returns []string: 一个包含所有符合条件的成员名字的切片。若无过期数据,则返回 nil。

核心超频设计:

由于跳表底层(第 0 层)是一条严格从小到大单向排列的单链表。此函数会【直接上读锁】,
从最左侧(分数最小、最早过期的数据)向右线性顺序收割,一旦遇到第一个大于 maxScore 的元素,
说明后续几十万数据全部合法,立马执行 break 熔断。
当 50w 数据中只有 5 条过期时,只会循环 5 次。耗时与总数 N 彻底解耦!支持千万级高并发。

使用方法:

expiredPoints := zset.ZRangeByScore(time.Now().Unix())

func (*GoZSet) ZRem

func (z *GoZSet) ZRem(member string) bool

ZRem 从有序集合中精准、级联删除指定的成员。

参数描述:

@param member (string): 准备剔除的成员唯一标识名字。

返回值:

@returns bool: 删除结果状态。返回 true 代表该元素存在且已成功抹去;返回 false 代表元素本身不存在,什么都没做。

行为逻辑:

通过 Map 获取该成员的分数,随后利用跳表的多层高架索引高速搜寻该节点,将其前后指针断开。
内存释放交给 Go 原生 GC,耗时严格控制在 O(log N)。

使用方法:

wasDeleted := zset.ZRem("point_A")

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL