Sfoglia il codice sorgente

use a proper cache

e.g. lru, written by google/go people and it's hopefully going to
protect us from consuming too much memory.
Lucas Stadler 11 anni fa
parent
commit
2fbb095193
1 ha cambiato i file con 9 aggiunte e 7 eliminazioni
  1. 9 7
      go/favicon.go

+ 9 - 7
go/favicon.go

1
package main
1
package main
2
2
3
import (
3
import (
4
	"code.google.com/p/cascadia"
5
	"code.google.com/p/go.net/html"
6
	"errors"
4
	"errors"
7
	"fmt"
5
	"fmt"
8
	"net/http"
6
	"net/http"
9
	"net/url"
7
	"net/url"
10
	"os"
8
	"os"
11
	"sync"
9
	"sync"
10
11
	"code.google.com/p/cascadia"
12
	"code.google.com/p/go.net/html"
13
	"github.com/golang/groupcache/lru"
12
)
14
)
13
15
14
var faviconCache = make(map[string]string)
16
var faviconCache = lru.New(10000)
15
var lock sync.RWMutex
17
var lock sync.RWMutex
16
18
17
func main() {
19
func main() {
50
		host = parsed.Host
52
		host = parsed.Host
51
	}
53
	}
52
	lock.RLock()
54
	lock.RLock()
53
	faviconUrl, cached := faviconCache[host]
55
	fu, cached := faviconCache.Get(host)
54
	lock.RUnlock()
56
	lock.RUnlock()
55
57
56
	if cached {
58
	if cached {
57
		return faviconUrl, nil
59
		return fu.(string), nil
58
	}
60
	}
59
61
60
	faviconUrl, err = GetFavicon(u)
62
	faviconUrl, err := GetFavicon(u)
61
	if err != nil {
63
	if err != nil {
62
		return faviconUrl, err
64
		return faviconUrl, err
63
	}
65
	}
64
66
65
	lock.Lock()
67
	lock.Lock()
66
	faviconCache[host] = faviconUrl
68
	faviconCache.Add(host, faviconUrl)
67
	lock.Unlock()
69
	lock.Unlock()
68
	return faviconUrl, nil
70
	return faviconUrl, nil
69
}
71
}