1
0
mirror of https://github.com/redis/go-redis.git synced 2025-07-04 14:02:29 +03:00
Files
go-redis/doctests/home_prob_dts_test.go
andy-stark-redis 884f9970c0 DOC-5229 probabilistic data type examples (#3413)
* DOC-5078 added basic vector set examples

* DOC-5078 formatting and extra comments

* DOC-5078 fixed nondeterministic test

* wip(tests): run doctests for vector sets on redis 8 only

* DOC-5229 added probabilistic data type examples

---------

Co-authored-by: Nedyalko Dyakov <nedyalko.dyakov@gmail.com>
2025-06-23 11:49:36 +03:00

413 lines
6.9 KiB
Go

// EXAMPLE: home_prob_dts
// HIDE_START
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
// HIDE_END
func ExampleClient_probabilistic_datatypes() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
// REMOVE_START
rdb.FlushDB(ctx)
rdb.Del(ctx,
"recorded_users", "other_users",
"group:1", "group:2", "both_groups",
"items_sold",
"male_heights", "female_heights", "all_heights",
"top_3_songs")
// REMOVE_END
// STEP_START bloom
res1, err := rdb.BFMAdd(
ctx,
"recorded_users",
"andy", "cameron", "david", "michelle",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res1) // >>> [true true true true]
res2, err := rdb.BFExists(ctx,
"recorded_users", "cameron",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res2) // >>> true
res3, err := rdb.BFExists(ctx, "recorded_users", "kaitlyn").Result()
if err != nil {
panic(err)
}
fmt.Println(res3) // >>> false
// STEP_END
// STEP_START cuckoo
res4, err := rdb.CFAdd(ctx, "other_users", "paolo").Result()
if err != nil {
panic(err)
}
fmt.Println(res4) // >>> true
res5, err := rdb.CFAdd(ctx, "other_users", "kaitlyn").Result()
if err != nil {
panic(err)
}
fmt.Println(res5) // >>> true
res6, err := rdb.CFAdd(ctx, "other_users", "rachel").Result()
if err != nil {
panic(err)
}
fmt.Println(res6) // >>> true
res7, err := rdb.CFMExists(ctx,
"other_users", "paolo", "rachel", "andy",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res7) // >>> [true true false]
res8, err := rdb.CFDel(ctx, "other_users", "paolo").Result()
if err != nil {
panic(err)
}
fmt.Println(res8) // >>> true
res9, err := rdb.CFExists(ctx, "other_users", "paolo").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> false
// STEP_END
// STEP_START hyperloglog
res10, err := rdb.PFAdd(
ctx,
"group:1",
"andy", "cameron", "david",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res10) // >>> 1
res11, err := rdb.PFCount(ctx, "group:1").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> 3
res12, err := rdb.PFAdd(ctx,
"group:2",
"kaitlyn", "michelle", "paolo", "rachel",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> 1
res13, err := rdb.PFCount(ctx, "group:2").Result()
if err != nil {
panic(err)
}
fmt.Println(res13) // >>> 4
res14, err := rdb.PFMerge(
ctx,
"both_groups",
"group:1", "group:2",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res14) // >>> OK
res15, err := rdb.PFCount(ctx, "both_groups").Result()
if err != nil {
panic(err)
}
fmt.Println(res15) // >>> 7
// STEP_END
// STEP_START cms
// Specify that you want to keep the counts within 0.01
// (0.1%) of the true value with a 0.005 (0.05%) chance
// of going outside this limit.
res16, err := rdb.CMSInitByProb(ctx, "items_sold", 0.01, 0.005).Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> OK
// The parameters for `CMSIncrBy()` are two lists. The count
// for each item in the first list is incremented by the
// value at the same index in the second list.
res17, err := rdb.CMSIncrBy(ctx, "items_sold",
"bread", 300,
"tea", 200,
"coffee", 200,
"beer", 100,
).Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> [300 200 200 100]
res18, err := rdb.CMSIncrBy(ctx, "items_sold",
"bread", 100,
"coffee", 150,
).Result()
if err != nil {
panic(err)
}
fmt.Println(res18) // >>> [400 350]
res19, err := rdb.CMSQuery(ctx,
"items_sold",
"bread", "tea", "coffee", "beer",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> [400 200 350 100]
// STEP_END
// STEP_START tdigest
res20, err := rdb.TDigestCreate(ctx, "male_heights").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> OK
res21, err := rdb.TDigestAdd(ctx, "male_heights",
175.5, 181, 160.8, 152, 177, 196, 164,
).Result()
if err != nil {
panic(err)
}
fmt.Println(res21) // >>> OK
res22, err := rdb.TDigestMin(ctx, "male_heights").Result()
if err != nil {
panic(err)
}
fmt.Println(res22) // >>> 152
res23, err := rdb.TDigestMax(ctx, "male_heights").Result()
if err != nil {
panic(err)
}
fmt.Println(res23) // >>> 196
res24, err := rdb.TDigestQuantile(ctx, "male_heights", 0.75).Result()
if err != nil {
panic(err)
}
fmt.Println(res24) // >>> [181]
// Note that the CDF value for 181 is not exactly
// 0.75. Both values are estimates.
res25, err := rdb.TDigestCDF(ctx, "male_heights", 181).Result()
if err != nil {
panic(err)
}
fmt.Printf("%.4f\n", res25[0]) // >>> 0.7857
res26, err := rdb.TDigestCreate(ctx, "female_heights").Result()
if err != nil {
panic(err)
}
fmt.Println(res26) // >>> OK
res27, err := rdb.TDigestAdd(ctx, "female_heights",
155.5, 161, 168.5, 170, 157.5, 163, 171,
).Result()
if err != nil {
panic(err)
}
fmt.Println(res27) // >>> OK
res28, err := rdb.TDigestQuantile(ctx, "female_heights", 0.75).Result()
if err != nil {
panic(err)
}
fmt.Println(res28) // >>> [170]
res29, err := rdb.TDigestMerge(ctx, "all_heights",
nil,
"male_heights", "female_heights",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res29) // >>> OK
res30, err := rdb.TDigestQuantile(ctx, "all_heights", 0.75).Result()
if err != nil {
panic(err)
}
fmt.Println(res30) // >>> [175.5]
// STEP_END
// STEP_START topk
// Create a TopK filter that keeps track of the top 3 items
res31, err := rdb.TopKReserve(ctx, "top_3_songs", 3).Result()
if err != nil {
panic(err)
}
fmt.Println(res31) // >>> OK
// Add some items to the filter
res32, err := rdb.TopKIncrBy(ctx,
"top_3_songs",
"Starfish Trooper", 3000,
"Only one more time", 1850,
"Rock me, Handel", 1325,
"How will anyone know?", 3890,
"Average lover", 4098,
"Road to everywhere", 770,
).Result()
if err != nil {
panic(err)
}
fmt.Println(res32)
// >>> [ Rock me, Handel Only one more time ]
res33, err := rdb.TopKList(ctx, "top_3_songs").Result()
if err != nil {
panic(err)
}
fmt.Println(res33)
// >>> [Average lover How will anyone know? Starfish Trooper]
// Query the count for specific items
res34, err := rdb.TopKQuery(
ctx,
"top_3_songs",
"Starfish Trooper", "Road to everywhere",
).Result()
if err != nil {
panic(err)
}
fmt.Println(res34) // >>> [true false]
// STEP_END
// Output:
// [true true true true]
// true
// false
// true
// true
// true
// [true true false]
// true
// false
// 1
// 3
// 1
// 4
// OK
// 7
// OK
// [300 200 200 100]
// [400 350]
// [400 200 350 100]
// OK
// OK
// 152
// 196
// [181]
// 0.7857
// OK
// OK
// [170]
// OK
// [175.5]
// OK
// [ Rock me, Handel Only one more time ]
// [Average lover How will anyone know? Starfish Trooper]
// [true false]
}