-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathcache.go
More file actions
68 lines (55 loc) · 1.35 KB
/
cache.go
File metadata and controls
68 lines (55 loc) · 1.35 KB
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
package main
import (
"errors"
"strings"
)
type CacheEngine interface {
Exists(key string) bool
Write(key string, data []byte) error
Read(key string) ([]byte, error)
// Delete()
}
type CacheEngineAdapter interface {
CacheKey(query *Query) string
}
type Cache struct {
engine CacheEngine
adapter CacheEngineAdapter
}
func NewCache() *Cache {
config := LoadConfig()
var e CacheEngine
var a CacheEngineAdapter
switch strings.ToLower(config.Cache.Engine) {
case "file":
e = NewFileEngine()
a = NewFileEngineAdapter()
case "redis":
if config.Cache.Redis.Pool.Enable {
e = NewRedisPoolEngine()
a = NewRedisEngineAdapter()
} else {
e = NewRedisEngine(config.Cache.Redis.Host, config.Cache.Redis.Port)
a = NewRedisEngineAdapter()
}
}
var ok bool
_, ok = e.(CacheEngine)
if !ok {
panic(errors.New(`cache engine is not available.`))
}
_, ok = a.(CacheEngineAdapter)
if !ok {
panic(errors.New(`cache engine adapter is not available.`))
}
return &Cache{engine: e, adapter: a}
}
func (cache *Cache) Write(query *Query, data []byte) error {
return cache.engine.Write(cache.adapter.CacheKey(query), data)
}
func (cache *Cache) Exists(query *Query) bool {
return cache.engine.Exists(cache.adapter.CacheKey(query))
}
func (cache *Cache) Read(query *Query) ([]byte, error) {
return cache.engine.Read(cache.adapter.CacheKey(query))
}