Skip to content

Commit 079ea8b

Browse files
authored
Merge pull request #4 from sysulq/feat/redisloader
feat: add redis loader
2 parents 8a4ca5b + 59dce43 commit 079ea8b

File tree

7 files changed

+701
-1
lines changed

7 files changed

+701
-1
lines changed

.github/workflows/go.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ on:
55
branches: [ main ]
66
pull_request:
77
branches: [ main ]
8-
8+
99
jobs:
1010

1111
build:
@@ -14,6 +14,13 @@ jobs:
1414
fail-fast: false
1515
matrix:
1616
version: ["1.22.x"]
17+
18+
services:
19+
redis:
20+
image: redis
21+
ports:
22+
- 6379:6379
23+
1724
steps:
1825
- uses: actions/checkout@v4
1926

go.mod

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,24 @@ go 1.22.4
44

55
require (
66
github.com/hashicorp/golang-lru/v2 v2.0.7
7+
github.com/redis/go-redis/v9 v9.6.1
8+
github.com/spf13/cast v1.6.0
9+
github.com/stretchr/testify v1.9.0
710
go.opentelemetry.io/otel/sdk v1.28.0
811
go.opentelemetry.io/otel/trace v1.28.0
12+
go.uber.org/mock v0.4.0
913
)
1014

1115
require (
16+
github.com/cespare/xxhash/v2 v2.2.0 // indirect
17+
github.com/davecgh/go-spew v1.1.1 // indirect
18+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
1219
github.com/go-logr/logr v1.4.2 // indirect
1320
github.com/go-logr/stdr v1.2.2 // indirect
1421
github.com/google/uuid v1.6.0 // indirect
22+
github.com/pmezard/go-difflib v1.0.0 // indirect
1523
go.opentelemetry.io/otel v1.28.0 // indirect
1624
go.opentelemetry.io/otel/metric v1.28.0 // indirect
1725
golang.org/x/sys v0.21.0 // indirect
26+
gopkg.in/yaml.v3 v3.0.1 // indirect
1827
)

go.sum

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
1+
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
2+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
3+
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
4+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
5+
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
6+
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
17
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
28
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
10+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
11+
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
12+
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
313
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
414
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
515
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -11,8 +21,18 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
1121
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
1222
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
1323
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
24+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
25+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
26+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
27+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
1428
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1529
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
30+
github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4=
31+
github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
32+
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
33+
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
34+
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
35+
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
1636
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
1737
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
1838
go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
@@ -23,7 +43,11 @@ go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBq
2343
go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
2444
go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
2545
go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
46+
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
47+
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
2648
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
2749
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
50+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
51+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2852
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
2953
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

redisloader/example_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package redisloader
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
"time"
8+
9+
"github.com/redis/go-redis/v9"
10+
"github.com/sysulq/dataloader-go"
11+
)
12+
13+
func TestExample(t *testing.T) {
14+
redisClient := redis.NewClient(&redis.Options{Addr: "localhost2379"})
15+
redisLoader := New(redisClient,
16+
func(ctx context.Context, keys []int) []dataloader.Result[string] {
17+
results := make([]dataloader.Result[string], len(keys))
18+
19+
for i, key := range keys {
20+
results[i] = dataloader.Wrap(fmt.Sprintf("Result for %d", key), nil)
21+
}
22+
return results
23+
})
24+
25+
loader := dataloader.New(
26+
redisLoader.Load,
27+
dataloader.WithCache(100, time.Minute),
28+
dataloader.WithBatchSize(50),
29+
dataloader.WithWait(5*time.Millisecond),
30+
)
31+
32+
ctx := context.Background()
33+
34+
// Load
35+
data, err := loader.Load(ctx, 1).Unwrap()
36+
if err != nil {
37+
t.Errorf("Unexpected error: %v", err)
38+
} else {
39+
fmt.Printf("Result: %s\n", data)
40+
// Output:
41+
// Result: Result for 1
42+
}
43+
44+
// LoadMany
45+
results := loader.LoadMany(ctx, []int{3, 4, 5})
46+
for _, result := range results {
47+
data, err := result.Unwrap()
48+
if err != nil {
49+
t.Errorf("Unexpected error: %v", err)
50+
} else {
51+
fmt.Printf("Result: %s\n", data)
52+
// Output:
53+
// Result: Result for 3
54+
// Result: Result for 4
55+
// Result: Result for 5
56+
}
57+
}
58+
59+
// LoadMap
60+
keys := []int{6, 7, 8}
61+
resultsMap := loader.LoadMap(ctx, keys)
62+
for _, key := range keys {
63+
data, err := resultsMap[key].Unwrap()
64+
if err != nil {
65+
t.Errorf("Unexpected error: %v", err)
66+
} else {
67+
fmt.Printf("Result: %s\n", data)
68+
// Output:
69+
// Result: Result for 6
70+
// Result: Result for 7
71+
// Result: Result for 8
72+
}
73+
}
74+
75+
// Prime
76+
loader.Prime(ctx, 8, "Prime result")
77+
data, err = loader.Load(ctx, 8).Unwrap()
78+
if err != nil {
79+
t.Errorf("Unexpected error: %v", err)
80+
} else {
81+
fmt.Printf("Result: %s\n", data)
82+
// Output:
83+
// Result: Prime result
84+
}
85+
86+
// Clear
87+
loader.Clear(7)
88+
data, err = loader.Load(ctx, 7).Unwrap()
89+
if err != nil {
90+
t.Errorf("Unexpected error: %v", err)
91+
} else {
92+
fmt.Printf("Result: %s\n", data)
93+
// Output:
94+
// Result: Result for 7
95+
}
96+
97+
// ClearAll
98+
loader.ClearAll()
99+
data, err = loader.Load(ctx, 8).Unwrap()
100+
if err != nil {
101+
t.Errorf("Unexpected error: %v", err)
102+
} else {
103+
fmt.Printf("Result: %s\n", data)
104+
// Output:
105+
// Result: Result for 8
106+
}
107+
}

redisloader/mocks/mocks.go

Lines changed: 113 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)