forked from go-redsync/redsync
/
goredis.go
82 lines (66 loc) · 1.78 KB
/
goredis.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package goredis
import (
"context"
"strings"
"time"
"github.com/go-redis/redis"
redsyncredis "github.com/n-h-n/redsync/v4/redis"
)
type pool struct {
delegate *redis.Client
}
func (p *pool) Get(ctx context.Context) (redsyncredis.Conn, error) {
c := p.delegate
if ctx != nil {
c = c.WithContext(ctx)
}
return &conn{c}, nil
}
// NewPool returns a Goredis-based pool implementation.
func NewPool(delegate *redis.Client) redsyncredis.Pool {
return &pool{delegate}
}
type conn struct {
delegate *redis.Client
}
func (c *conn) Get(name string) (string, error) {
value, err := c.delegate.Get(name).Result()
return value, noErrNil(err)
}
func (c *conn) Set(name string, value string) (bool, error) {
reply, err := c.delegate.Set(name, value, 0).Result()
return reply == "OK", noErrNil(err)
}
func (c *conn) SetNX(name string, value string, expiry time.Duration) (bool, error) {
ok, err := c.delegate.SetNX(name, value, expiry).Result()
return ok, noErrNil(err)
}
func (c *conn) PTTL(name string) (time.Duration, error) {
expiry, err := c.delegate.PTTL(name).Result()
return expiry, noErrNil(err)
}
func (c *conn) Eval(script *redsyncredis.Script, keysAndArgs ...interface{}) (interface{}, error) {
keys := make([]string, script.KeyCount)
args := keysAndArgs
if script.KeyCount > 0 {
for i := 0; i < script.KeyCount; i++ {
keys[i] = keysAndArgs[i].(string)
}
args = keysAndArgs[script.KeyCount:]
}
v, err := c.delegate.EvalSha(script.Hash, keys, args...).Result()
if err != nil && strings.HasPrefix(err.Error(), "NOSCRIPT ") {
v, err = c.delegate.Eval(script.Src, keys, args...).Result()
}
return v, noErrNil(err)
}
func (c *conn) Close() error {
// Not needed for this library
return nil
}
func noErrNil(err error) error {
if err != redis.Nil {
return err
}
return nil
}