Documentation
¶
Index ¶
- Variables
- type CacheZSort
- func (c *CacheZSort) Del(keys ...string) int
- func (c *CacheZSort) Exists(key string) bool
- func (c *CacheZSort) Flush()
- func (c *CacheZSort) GetMemberRank(key, member string) (int, bool)
- func (c *CacheZSort) GetNextMember(key, member string) (string, *big.Rat, bool)
- func (c *CacheZSort) GetNextMemberString(key, member string) (string, string, bool)
- func (c *CacheZSort) GetPrevMember(key, member string) (string, *big.Rat, bool)
- func (c *CacheZSort) GetPrevMemberString(key, member string) (string, string, bool)
- func (c *CacheZSort) Keys() []string
- func (c *CacheZSort) ZAdd(key, member string, score *big.Rat) bool
- func (c *CacheZSort) ZAddFloat64(key, member string, score float64) bool
- func (c *CacheZSort) ZAddInt64(key, member string, score int64) bool
- func (c *CacheZSort) ZAddMultiple(key string, members map[string]*big.Rat) int
- func (c *CacheZSort) ZAddString(key, member, scoreStr string) (bool, error)
- func (c *CacheZSort) ZCard(key string) (int, bool)
- func (c *CacheZSort) ZCount(key string, min, max *big.Rat) int
- func (c *CacheZSort) ZIncrBy(key, member string, increment *big.Rat) (string, bool)
- func (c *CacheZSort) ZPopMax(key string, count int) []ScoreMember
- func (c *CacheZSort) ZPopMin(key string, count int) []ScoreMember
- func (c *CacheZSort) ZRange(key string, start, stop int, withScores bool) []interface{}
- func (c *CacheZSort) ZRangeByScore(key string, min, max *big.Rat, withScores bool, offset, count int) []interface{}
- func (c *CacheZSort) ZRank(key, member string) (int, bool)
- func (c *CacheZSort) ZRem(key, member string) bool
- func (c *CacheZSort) ZRemMultiple(key string, members []string) int
- func (c *CacheZSort) ZRemRangeByRank(key string, start, stop int) int
- func (c *CacheZSort) ZRemRangeByScore(key string, min, max *big.Rat) int
- func (c *CacheZSort) ZRevRange(key string, start, stop int, withScores bool) []interface{}
- func (c *CacheZSort) ZRevRangeByScore(key string, max, min *big.Rat, withScores bool, offset, count int) []interface{}
- func (c *CacheZSort) ZRevRank(key, member string) (int, bool)
- func (c *CacheZSort) ZScore(key, member string) (*big.Rat, bool)
- func (c *CacheZSort) ZScoreString(key, member string) (string, bool)
- type ScoreMember
- type SkipList
- func (sl *SkipList) All() []ScoreMember
- func (sl *SkipList) Clear()
- func (sl *SkipList) CountByScore(min, max *big.Rat) int
- func (sl *SkipList) Delete(member string, score *big.Rat) bool
- func (sl *SkipList) DeleteByMember(member string) bool
- func (sl *SkipList) GetByRank(rank int) (string, *big.Rat, bool)
- func (sl *SkipList) GetNextMember(member string) (string, *big.Rat, bool)
- func (sl *SkipList) GetPrevMember(member string) (string, *big.Rat, bool)
- func (sl *SkipList) GetRank(member string, score *big.Rat) int
- func (sl *SkipList) GetScore(member string) (*big.Rat, bool)
- func (sl *SkipList) InRankRange(member string, score *big.Rat, start, stop int) bool
- func (sl *SkipList) IncrementBy(member string, increment *big.Rat) (*big.Rat, bool)
- func (sl *SkipList) Insert(member string, score *big.Rat)
- func (sl *SkipList) Len() int
- func (sl *SkipList) Range(start, stop int, reverse bool) []ScoreMember
- func (sl *SkipList) RangeByScore(min, max *big.Rat, reverse bool) []ScoreMember
- func (sl *SkipList) RemoveByRank(start, stop int) int
- func (sl *SkipList) RemoveByScore(min, max *big.Rat) int
- type ZSet
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrInvalidScore = errors.New("invalid score format") ErrKeyNotFound = errors.New("key not found") ErrMemberNotFound = errors.New("member not found") )
错误定义
Functions ¶
This section is empty.
Types ¶
type CacheZSort ¶
type CacheZSort struct {
// contains filtered or unexported fields
}
CacheZSort 内存排序组件主结构
Example ¶
package main
import (
"fmt"
"math/big"
"github.com/atlaschan0010/csort"
)
func main() {
// 创建实例
cache := csort.New()
// 示例 1: 添加成员(高精度小数)
score := new(big.Rat)
score.SetString("12345678901234567890.12345678901234567890")
cache.ZAdd("myzset", "member1", score)
// 示例 2: 使用字符串添加
cache.ZAddString("myzset", "member2", "3.14159265358979323846")
// 示例 3: 使用 float64/int64 添加
cache.ZAddFloat64("myzset", "member3", 100.5)
cache.ZAddInt64("myzset", "member4", 42)
// 获取分数
got, _ := cache.ZScoreString("myzset", "member1")
fmt.Println("member1 score:", got[:20]+"...") // 只显示前20位
// 获取排名(从0开始)
rank, _ := cache.ZRank("myzset", "member1")
fmt.Println("member1 rank:", rank)
// 获取成员数量
card, _ := cache.ZCard("myzset")
fmt.Println("total members:", card)
}
Output: member1 score: 12345678901234567890... member1 rank: 3 total members: 4
Example (HighPrecision) ¶
package main
import (
"fmt"
"math/big"
"github.com/atlaschan0010/csort"
)
func main() {
cache := csort.New()
// Redis 无法精确存储的分数
highPrecision := "0.1234567890123456789012345678901234567890"
// CacheZSort 可以精确存储
cache.ZAddString("test", "member", highPrecision)
score, _ := cache.ZScore("test", "member")
// 验证精度
expected := new(big.Rat)
expected.SetString(highPrecision)
if score.Cmp(expected) == 0 {
fmt.Println("High precision match!")
}
}
Output: High precision match!
Example (Increment) ¶
package main
import (
"fmt"
"math/big"
"github.com/atlaschan0010/csort"
)
func main() {
cache := csort.New()
// 初始化玩家分数
cache.ZAddFloat64("game", "player1", 100)
// 增加分数
increment := new(big.Rat)
increment.SetString("50")
newScore, _ := cache.ZIncrBy("game", "player1", increment)
fmt.Println("New score:", newScore)
// 对不存在的成员增加(相当于添加)
newScore2, _ := cache.ZIncrBy("game", "player2", big.NewRat(25, 1))
fmt.Println("Player2 score:", newScore2)
}
Output: New score: 150.00000000000000000000 Player2 score: 25.00000000000000000000
Example (Neighbor) ¶
package main
import (
"fmt"
"github.com/atlaschan0010/csort"
)
func main() {
cache := csort.New()
// 添加排行榜数据
cache.ZAddFloat64("ranking", "alice", 100)
cache.ZAddFloat64("ranking", "bob", 200)
cache.ZAddFloat64("ranking", "charlie", 300)
// 查询 bob 的前一位
prevMember, prevScore, _ := cache.GetPrevMember("ranking", "bob")
fmt.Printf("Before bob: %s (score: %s)\n", prevMember, prevScore.FloatString(0))
// 查询 bob 的后一位
nextMember, nextScore, _ := cache.GetNextMember("ranking", "bob")
fmt.Printf("After bob: %s (score: %s)\n", nextMember, nextScore.FloatString(0))
// 查询 alice 的前一位(不存在)
_, _, ok := cache.GetPrevMember("ranking", "alice")
fmt.Printf("Before alice exists: %v\n", ok)
// 查询 charlie 的后一位(不存在)
_, _, ok = cache.GetNextMember("ranking", "charlie")
fmt.Printf("After charlie exists: %v\n", ok)
}
Output: Before bob: alice (score: 100) After bob: charlie (score: 300) Before alice exists: false After charlie exists: false
Example (RangeQuery) ¶
package main
import (
"fmt"
"github.com/atlaschan0010/csort"
)
func main() {
cache := csort.New()
// 添加一些数据
cache.ZAddFloat64("leaderboard", "alice", 100)
cache.ZAddFloat64("leaderboard", "bob", 200)
cache.ZAddFloat64("leaderboard", "charlie", 150)
cache.ZAddFloat64("leaderboard", "david", 300)
cache.ZAddFloat64("leaderboard", "eve", 250)
// 获取前3名(倒序,分数高的在前)
top3 := cache.ZRevRange("leaderboard", 0, 2, true)
fmt.Println("Top 3:")
for i := 0; i < len(top3); i += 2 {
member := top3[i].(string)
score := top3[i+1].(string)
fmt.Printf(" %d. %s: %s\n", i/2+1, member, score)
}
// 获取排名在 1-3 的成员(正序)
midRange := cache.ZRange("leaderboard", 1, 3, false)
fmt.Println("Rank 1-3:", midRange)
}
Output: Top 3: 1. david: 300.00000000000000000000 2. eve: 250.00000000000000000000 3. bob: 200.00000000000000000000 Rank 1-3: [charlie bob eve]
Example (ScoreRange) ¶
package main
import (
"fmt"
"math/big"
"github.com/atlaschan0010/csort"
)
func main() {
cache := csort.New()
// 添加价格数据
cache.ZAddString("prices", "item1", "10.99")
cache.ZAddString("prices", "item2", "25.50")
cache.ZAddString("prices", "item3", "5.00")
cache.ZAddString("prices", "item4", "100.00")
cache.ZAddString("prices", "item5", "15.00")
// 查询价格在 10-30 之间的商品
min := new(big.Rat)
min.SetString("10")
max := new(big.Rat)
max.SetString("30")
items := cache.ZRangeByScore("prices", min, max, true, 0, -1)
fmt.Println("Items between 10-30:")
for i := 0; i < len(items); i += 2 {
member := items[i].(string)
score := items[i+1].(string)
fmt.Printf(" %s: $%s\n", member, score)
}
// 统计价格在 10-30 之间的商品数量
count := cache.ZCount("prices", min, max)
fmt.Println("Count:", count)
}
Output: Items between 10-30: item1: $10.99000000000000000000 item5: $15.00000000000000000000 item2: $25.50000000000000000000 Count: 3
func (*CacheZSort) GetMemberRank ¶
func (c *CacheZSort) GetMemberRank(key, member string) (int, bool)
GetMemberRank 根据 member 查询排名(从1开始) 这是 ZRank 的别名,返回 1-based 排名
func (*CacheZSort) GetNextMember ¶
GetNextMember 根据 member 查询后一位成员 返回: nextMember, nextScore, exists
func (*CacheZSort) GetNextMemberString ¶
func (c *CacheZSort) GetNextMemberString(key, member string) (string, string, bool)
GetNextMemberString 根据 member 查询后一位成员(分数为字符串格式) 返回: nextMember, nextScoreStr, exists
func (*CacheZSort) GetPrevMember ¶
GetPrevMember 根据 member 查询前一位成员 返回: prevMember, prevScore, exists
func (*CacheZSort) GetPrevMemberString ¶
func (c *CacheZSort) GetPrevMemberString(key, member string) (string, string, bool)
GetPrevMemberString 根据 member 查询前一位成员(分数为字符串格式) 返回: prevMember, prevScoreStr, exists
func (*CacheZSort) ZAdd ¶
func (c *CacheZSort) ZAdd(key, member string, score *big.Rat) bool
ZAdd 添加成员到有序集合
func (*CacheZSort) ZAddFloat64 ¶
func (c *CacheZSort) ZAddFloat64(key, member string, score float64) bool
ZAddFloat64 添加成员(分数为 float64)
func (*CacheZSort) ZAddInt64 ¶
func (c *CacheZSort) ZAddInt64(key, member string, score int64) bool
ZAddInt64 添加成员(分数为 int64)
func (*CacheZSort) ZAddMultiple ¶
ZAddMultiple 添加多个成员
func (*CacheZSort) ZAddString ¶
func (c *CacheZSort) ZAddString(key, member, scoreStr string) (bool, error)
ZAddString 添加成员(分数为字符串格式)
func (*CacheZSort) ZCount ¶
func (c *CacheZSort) ZCount(key string, min, max *big.Rat) int
ZCount 统计分数范围内的成员数量
func (*CacheZSort) ZPopMax ¶
func (c *CacheZSort) ZPopMax(key string, count int) []ScoreMember
ZPopMax 弹出分数最高的成员
func (*CacheZSort) ZPopMin ¶
func (c *CacheZSort) ZPopMin(key string, count int) []ScoreMember
ZPopMin 弹出分数最低的成员
func (*CacheZSort) ZRange ¶
func (c *CacheZSort) ZRange(key string, start, stop int, withScores bool) []interface{}
ZRange 获取指定排名范围的成员(正序,从0开始,闭区间)
func (*CacheZSort) ZRangeByScore ¶
func (c *CacheZSort) ZRangeByScore(key string, min, max *big.Rat, withScores bool, offset, count int) []interface{}
ZRangeByScore 根据分数范围获取成员(正序,闭区间)
func (*CacheZSort) ZRank ¶
func (c *CacheZSort) ZRank(key, member string) (int, bool)
ZRank 获取成员的正序排名(从0开始)
func (*CacheZSort) ZRemMultiple ¶
func (c *CacheZSort) ZRemMultiple(key string, members []string) int
ZRemMultiple 删除多个成员
func (*CacheZSort) ZRemRangeByRank ¶
func (c *CacheZSort) ZRemRangeByRank(key string, start, stop int) int
ZRemRangeByRank 删除指定排名范围的成员
func (*CacheZSort) ZRemRangeByScore ¶
func (c *CacheZSort) ZRemRangeByScore(key string, min, max *big.Rat) int
ZRemRangeByScore 删除指定分数范围的成员
func (*CacheZSort) ZRevRange ¶
func (c *CacheZSort) ZRevRange(key string, start, stop int, withScores bool) []interface{}
ZRevRange 获取指定排名范围的成员(倒序,从0开始,闭区间)
func (*CacheZSort) ZRevRangeByScore ¶
func (c *CacheZSort) ZRevRangeByScore(key string, max, min *big.Rat, withScores bool, offset, count int) []interface{}
ZRevRangeByScore 根据分数范围获取成员(倒序,闭区间)
func (*CacheZSort) ZRevRank ¶
func (c *CacheZSort) ZRevRank(key, member string) (int, bool)
ZRevRank 获取成员的倒序排名(从0开始)
func (*CacheZSort) ZScore ¶
func (c *CacheZSort) ZScore(key, member string) (*big.Rat, bool)
ZScore 获取成员的分数
func (*CacheZSort) ZScoreString ¶
func (c *CacheZSort) ZScoreString(key, member string) (string, bool)
ZScoreString 获取成员的分数(字符串格式)
type ScoreMember ¶
ScoreMember 表示一个分数-成员对
type SkipList ¶
type SkipList struct {
// contains filtered or unexported fields
}
SkipList 跳表实现
func (*SkipList) CountByScore ¶
CountByScore 统计分数范围内的成员数量
func (*SkipList) DeleteByMember ¶
DeleteByMember 仅根据 member 名称删除(不需要 score)
func (*SkipList) GetNextMember ¶
GetNextMember 获取后一位成员(分数更大,或分数相同但 member 字典序更大)
func (*SkipList) GetPrevMember ¶
GetPrevMember 获取前一位成员(分数更小,或分数相同但 member 字典序更小)
func (*SkipList) InRankRange ¶
InRankRange 检查成员是否在指定排名范围内
func (*SkipList) IncrementBy ¶
IncrementBy 增加成员的分数
func (*SkipList) Range ¶
func (sl *SkipList) Range(start, stop int, reverse bool) []ScoreMember
Range 获取排名范围内的成员 [start, stop] 闭区间(1-based)
func (*SkipList) RangeByScore ¶
func (sl *SkipList) RangeByScore(min, max *big.Rat, reverse bool) []ScoreMember
RangeByScore 根据分数范围获取成员
func (*SkipList) RemoveByRank ¶
RemoveByRank 删除排名范围内的所有成员 [start, stop] 1-based