/
cache.go
78 lines (73 loc) · 1.93 KB
/
cache.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
package data
import (
"errors"
"github.com/garyburd/redigo/redis"
"log"
)
type Cache struct {
Prefix string
Pool *redis.Pool
TTL int
}
///////////////////////////////////////////////////////////////////////////////////////////////////
func CreateCache(prefix string, pool *redis.Pool, ttlMin int) (r *Cache) {
r = &Cache{Prefix: prefix, Pool: pool, TTL: 60 * ttlMin} // actual TTL is in seconds
c := r.Pool.Get()
defer c.Close()
_, err := c.Do("PING")
if err != nil {
log.Printf("**** Cannot contact Redis server (%v). No caching!", err.Error())
return nil
}
return
}
///////////////////////////////////////////////////////////////////////////////////////////////////
func (r *Cache) GetCache(key string) ([]byte, error) {
c := r.Pool.Get()
defer c.Close()
if r.Prefix != "" {
key = r.Prefix + "_" + key
}
value, err := c.Do("GET", key)
if err != nil {
log.Printf("Redis error on GET: %v", err)
return nil, err
}
if value == nil {
//log.Printf("Redis cached val nil on GET: %v", err)
return nil, err
}
log.Printf("Redis GET: %s", key)
return value.([]byte), err
}
///////////////////////////////////////////////////////////////////////////////////////////////////
func (r *Cache) SetCache(key string, value []byte) (err error) {
c := r.Pool.Get()
defer c.Close()
if r.Prefix != "" {
key = r.Prefix + "_" + key
}
c.Send("MULTI")
c.Send("SET", key, value)
c.Send("EXPIRE", key, r.TTL)
response, err := redis.Values(c.Do("EXEC"))
if err != nil {
log.Printf("Redis error on SET or EXPIRE: %v", err)
return
}
var setResponse string
var expireResponse int
if _, err := redis.Scan(response, &setResponse, &expireResponse); err != nil {
log.Print("Error on scan of redis response")
}
if setResponse != "OK" {
err = errors.New("did not get OK from Redis SET")
log.Print(err)
return
}
if expireResponse != 1 {
log.Printf("Did not set expiration to %v", r.TTL)
}
log.Printf("Redis SET: %s", key)
return
}