golang概率数据结构服务与存储插件库skizze的使用
Golang概率数据结构服务与存储插件库Skizze的使用
概述
Skizze(德语中意为"草图")是一个用于处理计数和草图问题的概率数据结构存储服务。与键值存储不同,Skizze不存储值本身,而是将值追加到定义的草图中,允许以接近O(1)的时间复杂度解决频率和基数查询问题,同时占用最小的内存空间。
主要特性
- 当前状态:Alpha (版本v0.0.2)
- 使用Apache 2.0许可证
- 提供Go和Node.js绑定
安装与运行
make dist
./bin/skizze
Go绑定安装
go get github.com/skizzehq/goskizze/skizze
使用示例
1. 创建域(Domain)
package main
import (
"fmt"
"github.com/skizzehq/goskizze/skizze"
)
func main() {
// 连接到Skizze服务器
client, err := skizze.Dial("127.0.0.1:3596", skizze.Options{})
if err != nil {
panic(err)
}
defer client.Close()
// 创建一个新域
err = client.CreateDomain("demostream", 10000000, 100)
if err != nil {
fmt.Printf("创建域失败: %v\n", err)
return
}
fmt.Println("域创建成功")
}
2. 添加值到域
// 添加值到域
values := []string{"zod", "joker", "grod", "zod", "zod", "grod"}
err = client.AddToDomain("demostream", values...)
if err != nil {
fmt.Printf("添加值失败: %v\n", err)
return
}
fmt.Println("值添加成功")
3. 获取基数(Cardinality)
// 获取域的基数
cardinality, err := client.GetCardinality("demostream")
if err != nil {
fmt.Printf("获取基数失败: %v\n", err)
return
}
fmt.Printf("基数: %d\n", cardinality)
4. 获取排名(Rankings)
// 获取域的排名
rankings, err := client.GetRankings("demostream")
if err != nil {
fmt.Printf("获取排名失败: %v\n", err)
return
}
for _, ranking := range rankings {
fmt.Printf("排名: %d\t值: %s\t命中数: %d\n", ranking.Rank, ranking.Value, ranking.Count)
}
5. 获取频率(Frequencies)
// 获取特定值的频率
items := []string{"zod", "joker", "batman", "grod"}
freqs, err := client.GetFrequency("demostream", items...)
if err != nil {
fmt.Printf("获取频率失败: %v\n", err)
return
}
for _, freq := range freqs {
fmt.Printf("值: %s\t命中数: %d\n", freq.Value, freq.Count)
}
6. 获取成员资格(Membership)
// 检查值是否是成员
members, err := client.GetMembership("demostream", items...)
if err != nil {
fmt.Printf("获取成员资格失败: %v\n", err)
return
}
for _, member := range members {
fmt.Printf("值: %s\t成员: %t\n", member.Value, member.IsMember)
}
直接创建和使用草图
1. 创建基数草图
// 创建基数草图
err = client.CreateSketch("demosketch", skizze.SketchTypeCard)
if err != nil {
fmt.Printf("创建草图失败: %v\n", err)
return
}
// 添加值到基数草图
err = client.AddToSketch("demosketch", skizze.SketchTypeCard, values...)
if err != nil {
fmt.Printf("添加值到草图失败: %v\n", err)
return
}
// 获取基数草图的值
count, err := client.GetSketchCount("demosketch", skizze.SketchTypeCard)
if err != nil {
fmt.Printf("获取草图计数失败: %v\n", err)
return
}
fmt.Printf("草图基数: %d\n", count)
作者
- Seif Lotfy
- Neil Jagdish Patel
许可证
Skizze使用Apache License, Version 2.0许可证。
更多关于golang概率数据结构服务与存储插件库skizze的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang概率数据结构服务与存储插件库skizze的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Skizze - Golang概率数据结构服务与存储插件库
Skizze是一个用Go编写的概率数据结构服务,它提供了Bloom过滤器、HyperLogLog等概率数据结构的实现,可以作为服务运行或嵌入到应用中。
主要特性
- 支持多种概率数据结构
- 可作为独立服务运行
- 提供RESTful API接口
- 支持持久化存储
- 高性能Go实现
安装
go get github.com/seiflotfy/skizze
数据结构支持
Skizze支持以下概率数据结构:
- Bloom Filter - 高效成员检测
- Count-Min Sketch - 频率估计
- HyperLogLog - 基数估计
使用示例
1. 作为服务运行
skizze -config /path/to/config.json
2. Go客户端使用示例
package main
import (
"fmt"
"log"
"github.com/seiflotfy/skizze/client"
)
func main() {
// 创建客户端连接
cli, err := client.New("localhost:3596")
if err != nil {
log.Fatal(err)
}
defer cli.Close()
// 创建Bloom Filter
domain := "test-domain"
typ := "bloom"
err = cli.Create(domain, typ)
if err != nil {
log.Fatal(err)
}
// 添加元素
elements := []string{"item1", "item2", "item3"}
err = cli.Add(domain, elements...)
if err != nil {
log.Fatal(err)
}
// 检查元素是否存在
exists, err := cli.Exists(domain, "item1")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Item1 exists: %v\n", exists)
// 获取Bloom Filter信息
info, err := cli.Info(domain)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Bloom Filter info: %+v\n", info)
// 删除域
err = cli.Delete(domain)
if err != nil {
log.Fatal(err)
}
}
3. HyperLogLog使用示例
func hyperLogLogExample(cli *client.Client) {
domain := "hll-domain"
typ := "hll"
// 创建HyperLogLog
err := cli.Create(domain, typ)
if err != nil {
log.Fatal(err)
}
// 添加元素
elements := []string{"a", "b", "c", "d", "a", "b"}
err = cli.Add(domain, elements...)
if err != nil {
log.Fatal(err)
}
// 获取基数估计
count, err := cli.Count(domain)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Estimated unique elements: %d\n", count)
}
4. Count-Min Sketch使用示例
func countMinSketchExample(cli *client.Client) {
domain := "cms-domain"
typ := "cms"
// 创建Count-Min Sketch
err := cli.Create(domain, typ)
if err != nil {
log.Fatal(err)
}
// 添加元素
elements := []string{"a", "b", "c", "a", "a", "b"}
err = cli.Add(domain, elements...)
if err != nil {
log.Fatal(err)
}
// 获取元素频率
freq, err := cli.Frequency(domain, "a")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Frequency of 'a': %d\n", freq)
}
配置选项
Skizze可以通过配置文件自定义:
{
"address": "localhost:3596",
"dataDir": "/var/lib/skizze",
"storage": {
"type": "leveldb",
"path": "/var/lib/skizze/data"
},
"log": {
"level": "info",
"path": "/var/log/skizze.log"
}
}
性能考虑
- 对于大规模数据集,Bloom Filter可能需要较多内存
- HyperLogLog在精度和内存使用之间提供了良好的平衡
- Count-Min Sketch的精度取决于其宽度和深度
适用场景
- 重复数据检测
- 用户访问统计
- 大数据集的近似查询
- 网络流量监控
- 推荐系统去重
Skizze为Go开发者提供了一个简单高效的概率数据结构解决方案,既可作为独立服务也可作为库嵌入到应用中。