golang概率数据结构服务与存储插件库skizze的使用

Golang概率数据结构服务与存储插件库Skizze的使用

概述

Skizze(德语中意为"草图")是一个用于处理计数和草图问题的概率数据结构存储服务。与键值存储不同,Skizze不存储值本身,而是将值追加到定义的草图中,允许以接近O(1)的时间复杂度解决频率和基数查询问题,同时占用最小的内存空间。

Skizze架构图

主要特性

  • 当前状态: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支持以下概率数据结构:

  1. Bloom Filter - 高效成员检测
  2. Count-Min Sketch - 频率估计
  3. 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"
  }
}

性能考虑

  1. 对于大规模数据集,Bloom Filter可能需要较多内存
  2. HyperLogLog在精度和内存使用之间提供了良好的平衡
  3. Count-Min Sketch的精度取决于其宽度和深度

适用场景

  • 重复数据检测
  • 用户访问统计
  • 大数据集的近似查询
  • 网络流量监控
  • 推荐系统去重

Skizze为Go开发者提供了一个简单高效的概率数据结构解决方案,既可作为独立服务也可作为库嵌入到应用中。

回到顶部