forked from ptt/pttweb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cached_inproc.go
64 lines (52 loc) · 1.1 KB
/
cached_inproc.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
package main
import (
"strings"
"sync"
"time"
"github.com/ptt/pttweb/pttbbs"
)
type brdCacheEntry struct {
Board *pttbbs.Board
Expire time.Time
}
var (
brdCache = make(map[string]*brdCacheEntry)
brdCacheLk sync.Mutex
)
const (
brdCacheExpire = time.Minute * 5
)
func getBrdCache(brdname string) *pttbbs.Board {
brdCacheLk.Lock()
defer brdCacheLk.Unlock()
brdname = strings.ToLower(brdname)
entry := brdCache[brdname]
if entry != nil {
if time.Now().Before(entry.Expire) {
return entry.Board
} else {
delete(brdCache, brdname)
return nil
}
}
return nil
}
func setBrdCache(brdname string, board *pttbbs.Board) {
brdCacheLk.Lock()
defer brdCacheLk.Unlock()
brdCache[strings.ToLower(brdname)] = &brdCacheEntry{
Board: board,
Expire: time.Now().Add(brdCacheExpire),
}
}
func getBoardByNameCached(brdname string) (*pttbbs.Board, error) {
if brd := getBrdCache(brdname); brd != nil {
return brd, nil
}
board, err := pttbbs.OneBoard(ptt.GetBoards(pttbbs.BoardRefByName(brdname)))
if err != nil {
return nil, err
}
setBrdCache(brdname, &board)
return &board, nil
}