This package implement all commands to work with sonic. If there is one missing, open an issue ! :)
Sonic: https://github.com/valeriansaliou/sonic
go get github.com/expectedsh/go-sonic
package main
import (
"fmt"
"github.com/expectedsh/go-sonic/sonic"
)
func main() {
ingester, err := sonic.NewIngester("localhost", 1491, "SecretPassword")
if err != nil {
panic(err)
}
// I will ignore all errors for demonstration purposes
_ = ingester.BulkPush("movies", "general", 3, []sonic.IngestBulkRecord{
{"id:6ab56b4kk3", "Star wars"},
{"id:5hg67f8dg5", "Spider man"},
{"id:1m2n3b4vf6", "Batman"},
{"id:68d96h5h9d0", "This is another movie"},
})
search, err := sonic.NewSearch("localhost", 1491, "SecretPassword")
if err != nil {
panic(err)
}
results, _ := search.Query("movies", "general", "man", 10, 0)
fmt.Println(results)
}
Method BulkPush and BulkPop use custom connection pool with goroutine dispatch algorithm. This is the benchmark (file sonic/ingester_test.go):
goos: linux
goarch: amd64
pkg: github.com/expectedsh/go-sonic/sonic
BenchmarkIngesterChannel_BulkPushMaxCPUs-8 2 662657959 ns/op
BenchmarkIngesterChannel_BulkPush10-8 2 603779977 ns/op
BenchmarkIngesterChannel_Push-8 1 1023322864 ns/op
PASS
Bulk push is faster than for loop on Push. Hardware detail: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
The driver itself uses a connections pool, and it is thread-safe.