-
Notifications
You must be signed in to change notification settings - Fork 1
/
redisclient.go
117 lines (108 loc) · 2.85 KB
/
redisclient.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package govideo
import (
"fmt"
"strconv"
"time"
"github.com/garyburd/redigo/redis"
"github.com/mailru/easyjson"
"github.com/sickyoon/govideo/govideo/models"
)
// RedisClient -
type RedisClient struct {
*redis.Pool
secret string
userExpiry int
}
// NewRedisClient -
func NewRedisClient(config *models.Config) (*RedisClient, error) {
secret, err := GenerateKey()
if err != nil {
return nil, err
}
redisClient := &RedisClient{
Pool: &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", config.Cache.URI)
if err != nil {
return nil, err
}
if config.Cache.Password != "" {
if _, err := c.Do("AUTH", config.Cache.Password); err != nil {
c.Close()
return nil, err
}
}
if config.Cache.Database != "" {
if _, err := c.Do("SELECT", config.Cache.Database); err != nil {
c.Close()
return nil, err
}
}
return c, nil
},
},
secret: secret,
userExpiry: config.App.UserExpiry,
}
err = redisClient.Pool.Get().Err()
if err != nil {
return nil, fmt.Errorf("failed to connect to redis: %v", err)
}
return redisClient, nil
}
// SetAuthCache sets user data in redis cache
func (rc *RedisClient) SetAuthCache(userID string, data []byte) ([]byte, error) {
conn := rc.Get()
defer conn.Close()
key := []byte(rc.secret + ":user:" + userID)
_, err := conn.Do("SETEX", key, strconv.Itoa(rc.userExpiry), data)
return key, err
}
// GetAuthCache gets user data from redis cache
func (rc *RedisClient) GetAuthCache(key []byte) ([]byte, error) {
conn := rc.Get()
defer conn.Close()
return redis.Bytes(conn.Do("GET", key))
}
// ClearAuthCache clears user data from redis cache
func (rc *RedisClient) ClearAuthCache(key []byte) error {
conn := rc.Get()
defer conn.Close()
_, err := conn.Do("DEL", key)
return err
}
// GetEncodedPath returns encoded path from real file path
func (rc *RedisClient) GetEncodedPath(media *models.Media, ipAddr string) (string, error) {
conn := rc.Get()
defer conn.Close()
encodedPath, err := GenerateKey()
if err != nil {
return "", err
}
key := []byte(rc.secret + ":encoded:" + ipAddr + ":" + encodedPath)
mediaBytes, err := easyjson.Marshal(media)
if err != nil {
return "", err
}
_, err = conn.Do("SETEX", key, strconv.Itoa(rc.userExpiry), mediaBytes)
return encodedPath, err
}
// GetMedia returns Media struct from encodedPath
// make sure to release Media after use
func (rc *RedisClient) GetMedia(encodedPath, ipAddr string) (*models.Media, error) {
conn := rc.Get()
defer conn.Close()
key := []byte(rc.secret + ":encoded:" + ipAddr + ":" + encodedPath)
mediaBytes, err := redis.Bytes(conn.Do("GET", key))
if err != nil {
return nil, err
}
media := models.GetMedia()
err = easyjson.Unmarshal(mediaBytes, media)
if err != nil {
return nil, err
}
return media, nil
}