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 ¶
ZAdd 往有序集合中添加一个新成员,或者更新一个已存在成员的分数。
参数描述:
@param member (string): 成员的唯一标识标识(例如:测点编码 "NM0001")。保证全局唯一,不可重复。 @param score (int64) : 该成员绑定的分数权重(例如:未来的绝对过期秒级时间戳 1719912000)。
行为逻辑:
- 幂等/更新检查:若 member 已存在且分数相同,直接忽略并返回;若分数不同,则先从底层跳表无脑剥离旧节点,再执行新数据插入。
- 排序构建:新节点在底层通过多层级联指针搜索,耗时 O(log N) 自动降落到有序铁轨的正确坑位中。
注意事项:
此函数内部会上【写锁】,多个协程同时触发 ZAdd 时会发生微秒级排队,属于正常并发保护。
使用方法:
zset.ZAdd("point_A", time.Now().Add(10 * time.Minute).Unix())
func (*GoZSet) ZRangeByScore ¶
ZRangeByScore 获取所有分数小于或等于指定最大分数的成员名单(用于提取已到期数据)。
参数描述:
@param maxScore (int64): 查询分数的临界上限(在白名单场景下,通常传入当前系统的时间戳 UnixTime)。
返回值:
@returns []string: 一个包含所有符合条件的成员名字的切片。若无过期数据,则返回 nil。
核心超频设计:
由于跳表底层(第 0 层)是一条严格从小到大单向排列的单链表。此函数会【直接上读锁】, 从最左侧(分数最小、最早过期的数据)向右线性顺序收割,一旦遇到第一个大于 maxScore 的元素, 说明后续几十万数据全部合法,立马执行 break 熔断。 当 50w 数据中只有 5 条过期时,只会循环 5 次。耗时与总数 N 彻底解耦!支持千万级高并发。
使用方法:
expiredPoints := zset.ZRangeByScore(time.Now().Unix())
Click to show internal directories.
Click to hide internal directories.