Skip to content

Commit

Permalink
add code
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanvc committed Jan 12, 2024
1 parent a51b527 commit 5fffe9d
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 4 deletions.
13 changes: 9 additions & 4 deletions examples/metricapp/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"
"github.com/ethanvc/evo/base"
"github.com/ethanvc/evo/evohttp"
"github.com/ethanvc/evo/examples/metricapp/redishelper"
"github.com/ethanvc/evo/plog"
"github.com/redis/go-redis/v9"
"go.uber.org/fx"
Expand Down Expand Up @@ -92,9 +93,13 @@ func (controller *userController) queryUserFromCache(c context.Context, req *Que
c, cancel := context.WithTimeoutCause(c, time.Millisecond*100,
base.New(codes.DeadlineExceeded, "GetFromRedisTimeout").Err())
defer cancel()
cmd := controller.redisCli.Get(c, fmt.Sprintf("a_%d", req.Uid))
if cmd.Err() != nil {
return nil, errors.Join(base.New(codes.Internal, "UnknownRedisGetErr").Err(), cmd.Err())
resp, err = redishelper.Get[UserDto](c, controller.redisCli, fmt.Sprintf("a_%d", req.Uid))
switch err {
case redis.Nil:
return nil, base.New(codes.NotFound, "UserNotFoundInCache").Err()
case nil:
return resp, nil
default:
return nil, errors.Join(base.New(codes.Internal, "UnknownRedisGetErr").Err(), err)
}
return
}
20 changes: 20 additions & 0 deletions examples/metricapp/redishelper/redishelper.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package redishelper

import (
"context"
"encoding/json"
"github.com/redis/go-redis/v9"
)

func Get[Resp any](c context.Context, cli redis.UniversalClient, key string) (*Resp, error) {
cmd := cli.Get(c, key)
if cmd.Err() != nil {
return nil, cmd.Err()
}
var resp *Resp
err := json.Unmarshal([]byte(cmd.String()), &resp)
if err != nil {
return nil, err
}
return resp, nil
}
60 changes: 60 additions & 0 deletions rediscli/redis_client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package rediscli

import (
"context"
"encoding/json"
"github.com/redis/go-redis/v9"
"time"
)

type RedisClient struct {
cli redis.UniversalClient
conf *RedisClientConfig
}

func NewRedisClient(cli redis.UniversalClient, conf *RedisClientConfig) *RedisClient {
if conf == nil {
conf = &RedisClientConfig{}
}
return &RedisClient{
cli: cli,
conf: conf,
}
}

func (cli *RedisClient) Get(c context.Context, key string, resp any) error {
cmd := cli.cli.Get(c, key)
if cmd.Err() == nil {
return cli.decode(c, key, cmd, resp)
} else {
return cmd.Err()
}
}

func (cli *RedisClient) Set(c context.Context, key string, value any, expire time.Duration) error {
err := cli.cli.Set(c, key, value, expire)
if err.Err() != nil {
return err.Err()
}
return nil
}

func (cli *RedisClient) decode(c context.Context, key string, cmd *redis.StringCmd, resp any) error {
if cli.conf.Decoder != nil {
return cli.conf.Decoder(c, key, cmd, resp)
}
buf, err := cmd.Bytes()
if err != nil {
return err
}
err = json.Unmarshal(buf, resp)
if err != nil {
return err
}
return nil
}

type RedisClientConfig struct {
Encoder func(c context.Context, key string, value any) error
Decoder func(c context.Context, key string, cmd *redis.StringCmd, resp any) error
}
24 changes: 24 additions & 0 deletions rediscli/redis_client_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package rediscli

import (
"context"
"github.com/redis/go-redis/v9"
"github.com/stretchr/testify/require"
"testing"
)

func newTestClient() *RedisClient {
opt := &redis.UniversalOptions{}
cli := redis.NewUniversalClient(opt)
return NewRedisClient(cli, nil)
}

func TestRedisClient_Set(t *testing.T) {
cli := newTestClient()
err := cli.Set(context.Background(), "a", 3, 0)
require.NoError(t, err)
var n int
err = cli.Get(context.Background(), "a", &n)
require.NoError(t, err)
require.Equal(t, 3, n)
}

0 comments on commit 5fffe9d

Please sign in to comment.