Skip to content

Commit

Permalink
add go.mod, refactor benchmark and update radix to v3
Browse files Browse the repository at this point in the history
  • Loading branch information
funny-falcon-at-joomcode committed Mar 14, 2021
1 parent c0b75d1 commit 03ac18c
Show file tree
Hide file tree
Showing 12 changed files with 150 additions and 65 deletions.
17 changes: 10 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ test: testcluster testconn testredis
/tmp/redis-server/redis-server:
@echo "Building redis-$(REDIS_VERSION)..."
wget -nv -c $(REDIS_ARCHIVE)/$(REDIS_VERSION).tar.gz -O - | tar -xzC .
cd redis-$(REDIS_VERSION) && make -j 4
cd redis-$(REDIS_VERSION) && make -j 4 USE_JEMALLOC=no
if [ ! -e /tmp/redis-server ] ; then mkdir /tmp/redis-server ; fi
mv redis-$(REDIS_VERSION)/src/redis-server /tmp/redis-server
rm redis-$(REDIS_VERSION) -rf

testredis:
go test ./redis
testredis: /tmp/redis-server/redis-server
PATH=/tmp/redis-server/:${PATH} go test ./redis

testconn: /tmp/redis-server/redis-server
killall redis-server || true
Expand All @@ -26,8 +26,11 @@ testcluster: /tmp/redis-server/redis-server

bench: benchconn benchcluster

benchconn:
go test -count 1 -run FooBar -bench . -benchmem ./redisconn
benchconn: /tmp/redis-server/redis-server
PATH=/tmp/redis-server/:${PATH} ; cd ./redisconn/bench ; go test -count 1 -run FooBar -bench . -benchmem .

benchcluster:
go test -count 1 -tags debugredis -run FooBar -bench . -benchmem ./rediscluster
benchcluster: /tmp/redis-server/redis-server
PATH=/tmp/redis-server/:${PATH} ; cd ./rediscluster/bench ; go test -count 1 -tags debugredis -run FooBar -bench . -benchmem .

clean:
rm -r */redis_test_*
39 changes: 16 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,6 @@ RedisPipe – is a client for redis that uses "implicit pipelining" for highest
- hook for custom logging.
- hook for request timing reporting.

```
BenchmarkParallelGetSet/radixv2-8 1000000 9245 ns/op 1268 B/op 32 allocs/op
BenchmarkParallelGetSet/redigo-8 1000000 6886 ns/op 399 B/op 13 allocs/op
BenchmarkParallelGetSet/redispipe-8 5000000 1636 ns/op 219 B/op 12 allocs/op
```

## Introduction

https://redis.io/topics/pipelining
Expand All @@ -56,8 +50,9 @@ pipelining has to be implicit.
- Ruby's EventMachine related connectors,
- etc

But there was no such connector for Golang. All known Golang redis connectors use a
connection-per-request model with a connection pool, and provide only explicit pipelining.
At the moment this connector were created there was no such connector for Golang.
All known Golang redis connectors use a connection-per-request model with a connection pool,
and provide only explicit pipelining.

This connector was created as implicitly pipelined from the ground up to achieve maximum performance
in a highly concurrent environment. It writes all requests to single connection to redis, and
Expand All @@ -71,22 +66,20 @@ runtime latency for switching goroutines still remains, however, and could not b

## Performance

Tests were performed on localhost Xeon(R) CPU E3-1245 v6 @ 3.70GHz (4 cores, 8 HT)

### Single redis

```
go test -count 1 -run FooBar -bench . -benchmem -benchtime 5s ./redisconn
goos: linux
goarch: amd64
pkg: github.com/joomcode/redispipe/redisconn
BenchmarkSerialGetSet/radixv2-8 200000 32257 ns/op 256 B/op 11 allocs/op
BenchmarkSerialGetSet/redigo-8 200000 31785 ns/op 86 B/op 5 allocs/op
BenchmarkSerialGetSet/redispipe-8 30000 266490 ns/op 168 B/op 8 allocs/op
BenchmarkSerialGetSet/redispipe_pause0-8 200000 44396 ns/op 168 B/op 8 allocs/op
BenchmarkParallelGetSet/radixv2-8 500000 12756 ns/op 260 B/op 11 allocs/op
BenchmarkParallelGetSet/redigo-8 1000000 12486 ns/op 123 B/op 6 allocs/op
BenchmarkParallelGetSet/redispipe-8 5000000 1435 ns/op 168 B/op 8 allocs/op
pkg: github.com/joomcode/redispipe/rediscluster
cpu: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz
BenchmarkSerialGetSet/radix_pause0-12 17691 63132 ns/op 68 B/op 4 allocs/op
BenchmarkSerialGetSet/redigo-12 19519 60064 ns/op 239 B/op 13 allocs/op
BenchmarkSerialGetSet/redispipe-12 504 2661790 ns/op 290 B/op 12 allocs/op
BenchmarkSerialGetSet/redispipe_pause0-12 13669 84925 ns/op 208 B/op 12 allocs/op
BenchmarkParallelGetSet/radix-12 621036 1817 ns/op 78 B/op 4 allocs/op
BenchmarkParallelGetSet/redigo-12 7466 153584 ns/op 4008 B/op 20 allocs/op
BenchmarkParallelGetSet/redispipe-12 665428 1599 ns/op 231 B/op 12 allocs/op
```

You can see a couple of things:
Expand All @@ -103,10 +96,10 @@ performance, though there is still small overhead of internal design. But I woul
disable batching (unless your use case is single threaded), because it increases CPU usage under
highly concurrent load both on client and on redis-server.

Parallel benchmark for single redis has Redis CPU usage as a bottleneck for both `radix.v2` and
`redigo` (ie Redis eats whole CPU core). But with redispipe, Redis server consumes only 75% of
a core despite the fact that it could serve 8 times more requests. It clearly shows how usage of
implicitly pipelined connector helps to get much more RPS from single Redis server.
To be honestly, github.com/mediocregopher/radix/v3 is also able to perform implicit pipelining
and does it by default. Therefore it is almost as fast as redispipe in ParallelGetSet.
SerialGetSet is tested with disabled pipelining, because otherwise it will be as slow as
redispipe without pause0.

### Cluster

Expand Down
8 changes: 8 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module github.com/joomcode/redispipe

go 1.16

require (
github.com/joomcode/errorx v1.0.3
github.com/stretchr/testify v1.7.0
)
15 changes: 15 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/joomcode/errorx v1.0.3 h1:3e1mi0u7/HTPNdg6d6DYyKGBhA5l9XpsfuVE29NxnWw=
github.com/joomcode/errorx v1.0.3/go.mod h1:eQzdtdlNyN7etw6YCS4W4+lu442waxZYw5yvz0ULrRo=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
33 changes: 17 additions & 16 deletions rediscluster/bench_test.go → rediscluster/bench/bench_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package rediscluster_test
package bench

import (
"context"
Expand All @@ -11,13 +11,11 @@ import (

"github.com/joomcode/redispipe/rediscluster"
"github.com/joomcode/redispipe/testbed"

"github.com/joomcode/redispipe/redis"

redigo "github.com/chasex/redis-go-cluster"
"github.com/joomcode/redispipe/redisconn"

radixv2cluster "github.com/mediocregopher/radix.v2/cluster"
redigo "github.com/wuxibin89/redis-go-cluster"
radix "github.com/mediocregopher/radix/v3"
)

func benchCluster(port int) func() {
Expand All @@ -33,8 +31,14 @@ func benchCluster(port int) func() {
func BenchmarkSerialGetSet(b *B) {
defer benchCluster(45000)()
rng := rand.New(rand.NewSource(1))
b.Run("radixv2", func(b *B) {
rdxv2, err := radixv2cluster.New("127.0.0.1:45000")
b.Run("radix_pause0", func(b *B) {
rdxv2, err := radix.NewCluster(
[]string{"127.0.0.1:45000"},
radix.ClusterPoolFunc(func(network, addr string) (radix.Client, error) {
return radix.NewPool(network, addr, 4,
radix.PoolPipelineWindow(0, 0))
}),
)
if err != nil {
b.Fatal(err)
return
Expand All @@ -43,10 +47,10 @@ func BenchmarkSerialGetSet(b *B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
key := "foo" + strconv.Itoa(rng.Intn(65536))
if err := rdxv2.Cmd("SET", key, "bar").Err; err != nil {
if err := rdxv2.Do(radix.Cmd(nil, "SET", key, "bar")); err != nil {
b.Fatal(err)
}
if err := rdxv2.Cmd("GET", key).Err; err != nil {
if err := rdxv2.Do(radix.Cmd(nil, "GET", key)); err != nil {
b.Fatal(err)
}
}
Expand Down Expand Up @@ -132,22 +136,19 @@ func BenchmarkParallelGetSet(b *B) {
})
}

b.Run("radixv2", func(b *B) {
rdx2, err := radixv2cluster.NewWithOpts(radixv2cluster.Opts{
Addr: "127.0.0.1:45000",
PoolSize: 128,
})
b.Run("radix", func(b *B) {
rdx2, err := radix.NewCluster([]string{"127.0.0.1:45000"})
defer rdx2.Close()
if err != nil {
b.Fatal(err)
}
b.ResetTimer()
do(b, func(rng *rand.Rand) {
key := "foo" + strconv.Itoa(rng.Intn(65536))
if err := rdx2.Cmd("SET", key, "bar").Err; err != nil {
if err := rdx2.Do(radix.Cmd(nil, "SET", key, "bar")); err != nil {
b.Fatal(err)
}
if err := rdx2.Cmd("GET", key).Err; err != nil {
if err := rdx2.Do(radix.Cmd(nil, "GET", key)); err != nil {
b.Fatal(err)
}
})
Expand Down
11 changes: 11 additions & 0 deletions rediscluster/bench/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module github.com/joomcode/redispipe/rediscluster/bench

go 1.16

replace github.com/joomcode/redispipe => ../..

require (
github.com/joomcode/redispipe v0.0.0-00010101000000-000000000000
github.com/mediocregopher/radix/v3 v3.7.0
github.com/wuxibin89/redis-go-cluster v1.0.1-0.20161207023922-222d81891f1d
)
22 changes: 22 additions & 0 deletions rediscluster/bench/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/joomcode/errorx v1.0.3 h1:3e1mi0u7/HTPNdg6d6DYyKGBhA5l9XpsfuVE29NxnWw=
github.com/joomcode/errorx v1.0.3/go.mod h1:eQzdtdlNyN7etw6YCS4W4+lu442waxZYw5yvz0ULrRo=
github.com/mediocregopher/radix.v2 v0.0.0-20181115013041-b67df6e626f9/go.mod h1:fLRUbhbSd5Px2yKUaGYYPltlyxi1guJz1vCmo1RQL50=
github.com/mediocregopher/radix/v3 v3.7.0 h1:SM9zJdme5pYGEVvh1HttjBjDmIaNBDKy+oDCv5w81Wo=
github.com/mediocregopher/radix/v3 v3.7.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/wuxibin89/redis-go-cluster v1.0.1-0.20161207023922-222d81891f1d h1:tXP1B4pzBLfNwopt8tc7EIno9dxoLE9mrW7cddo3AE8=
github.com/wuxibin89/redis-go-cluster v1.0.1-0.20161207023922-222d81891f1d/go.mod h1:tqX224sOzDC3Z3yeJj3Ti3NJH0gxqr1B+/TzpIWfHiQ=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
1 change: 1 addition & 0 deletions rediscluster/bench/stub.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package bench
32 changes: 13 additions & 19 deletions redisconn/bench_test.go → redisconn/bench/bench_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package redisconn_test
package bench

import (
"context"
Expand All @@ -8,11 +8,10 @@ import (
"github.com/joomcode/redispipe/redis"
"github.com/joomcode/redispipe/testbed"

redigo "github.com/garyburd/redigo/redis"
redigo "github.com/gomodule/redigo/redis"
"github.com/joomcode/redispipe/redisconn"

radixv2pool "github.com/mediocregopher/radix.v2/pool"
radixv2 "github.com/mediocregopher/radix.v2/redis"
radix "github.com/mediocregopher/radix/v3"
)

func benchServer(port int) func() {
Expand All @@ -27,19 +26,19 @@ func benchServer(port int) func() {

func BenchmarkSerialGetSet(b *B) {
defer benchServer(45678)()
b.Run("radixv2", func(b *B) {
rdxv2, err := radixv2.Dial("tcp", "127.0.0.1:45678")
b.Run("radix", func(b *B) {
rdxv2, err := radix.Dial("tcp", "127.0.0.1:45678")
if err != nil {
b.Fatal(err)
return
}
defer rdxv2.Close()
b.ResetTimer()
for i := 0; i < b.N; i++ {
if err := rdxv2.Cmd("SET", "foo", "bar").Err; err != nil {
if err := rdxv2.Do(radix.Cmd(nil, "SET", "foo", "bar")); err != nil {
b.Fatal(err)
}
if err := rdxv2.Cmd("GET", "foo").Err; err != nil {
if err := rdxv2.Do(radix.Cmd(nil, "GET", "foo")); err != nil {
b.Fatal(err)
}
}
Expand Down Expand Up @@ -103,7 +102,7 @@ func BenchmarkSerialGetSet(b *B) {

func BenchmarkParallelGetSet(b *B) {
defer benchServer(45678)()
parallel := runtime.GOMAXPROCS(0) * 8
parallel := runtime.GOMAXPROCS(0) * 2

do := func(b *B, fn func()) {
b.SetParallelism(parallel)
Expand All @@ -114,23 +113,18 @@ func BenchmarkParallelGetSet(b *B) {
})
}

b.Run("radixv2", func(b *B) {
rdx2, err := radixv2pool.New("tcp", "127.0.0.1:45678", parallel)
b.Run("radix", func(b *B) {
rdx2, err := radix.NewPool("tcp", "127.0.0.1:45678", parallel)
if err != nil {
b.Fatal(err)
}
defer rdx2.Empty()
defer rdx2.Close()
b.ResetTimer()
do(b, func() {
conn, err := rdx2.Get()
if err != nil {
if err := rdx2.Do(radix.Cmd(nil, "SET", "foo", "bar")); err != nil {
b.Fatal(err)
}
defer rdx2.Put(conn)
if conn.Cmd("SET", "foo", "bar").Err != nil {
b.Fatal(err)
}
if conn.Cmd("GET", "foo").Err != nil {
if err := rdx2.Do(radix.Cmd(nil, "GET", "foo")); err != nil {
b.Fatal(err)
}
})
Expand Down
11 changes: 11 additions & 0 deletions redisconn/bench/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module github.com/joomcode/redispipe/redisconn/bench

go 1.16

replace github.com/joomcode/redispipe => ../..

require (
github.com/gomodule/redigo v1.8.4
github.com/joomcode/redispipe v0.0.0-00010101000000-000000000000
github.com/mediocregopher/radix/v3 v3.7.0
)
25 changes: 25 additions & 0 deletions redisconn/bench/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/gomodule/redigo v1.8.4 h1:Z5JUg94HMTR1XpwBaSH4vq3+PNSIykBLxMdglbw10gg=
github.com/gomodule/redigo v1.8.4/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/joomcode/errorx v1.0.3 h1:3e1mi0u7/HTPNdg6d6DYyKGBhA5l9XpsfuVE29NxnWw=
github.com/joomcode/errorx v1.0.3/go.mod h1:eQzdtdlNyN7etw6YCS4W4+lu442waxZYw5yvz0ULrRo=
github.com/mediocregopher/radix.v2 v0.0.0-20181115013041-b67df6e626f9/go.mod h1:fLRUbhbSd5Px2yKUaGYYPltlyxi1guJz1vCmo1RQL50=
github.com/mediocregopher/radix/v3 v3.7.0 h1:SM9zJdme5pYGEVvh1HttjBjDmIaNBDKy+oDCv5w81Wo=
github.com/mediocregopher/radix/v3 v3.7.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/wuxibin89/redis-go-cluster v1.0.1-0.20161207023922-222d81891f1d/go.mod h1:tqX224sOzDC3Z3yeJj3Ti3NJH0gxqr1B+/TzpIWfHiQ=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
1 change: 1 addition & 0 deletions redisconn/bench/stub.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package bench

0 comments on commit 03ac18c

Please sign in to comment.