type httpAuxData struct {
fileType uint32
etagCRC uint32
rawKey []byte
}
type httpAux struct {
datas map[cache.Hash]httpAuxData
}
func (aux *httpAux) Add(key cache.Hash, auxItem interface{}) {
aux.datas[key] = auxItem.(httpAuxData)
}
func (aux *httpAux) Get(key cache.Hash) interface{} {
data, _ := aux.datas[key]
return data
}
func (aux *httpAux) Del(key cache.Hash) {
delete(aux.datas, key)
}
func (aux *httpAux) Load(path string) {
return
}
func (aux *httpAux) Dump(path string) {
return
}
func NewHttpAux(idx int) cache.Auxiliary {
return &httpAux{datas: make(map[cache.Hash]httpAuxData)}
}
func main() {
// 初始化存储
conf := cache.Config{
MetaDir: "/tmp/cache/meta/",
ActionParallel: 4,
AuxFactory: NewHttpAux}
// 大容量存储在前,快速存储在后,最低级存储建议用非易失存储
devices := [3]cache.DevConf{
cache.DevConf{
Name: "hdd",
Dir: "/tmp/cache/hdd/",
Capacity: 1000 * 1024 * 1024},
cache.DevConf{
Name: "ssd",
Dir: "/tmp/cache/ssd/",
Capacity: 100 * 1024 * 1024},
cache.DevConf{
Name: "mem",
Dir: "/tmp/cache/mem/", //实际可以使用而 /dev/shm/xxxx/
Capacity: 10 * 1024 * 1024},
}
c := cache.NewCache(conf, devices[:])
defer c.Close()
go func() {
time.Sleep(time.Minute)
c.Dump()
}()
// 添加一个对象
fmt.Println("add jpg")
jpgkey := md5.Sum([]byte("http://www.test.com/123/456/1.jpg"))
jpg := []byte("this is 1.jpg")
c.AddItem(jpgkey, time.Now().Unix()+3600, int64(len(jpg)), httpAuxData{
fileType: crc32.ChecksumIEEE([]byte("jpg")),
rawKey: []byte("http://www.test.com/123/456/1.jpg")})
c.AddSegment(jpgkey, 0, jpg)
// 热点数据升级到更快的存储中
fmt.Println(c.Get(jpgkey, 0, -1)) // hdd
fmt.Println(c.Get(jpgkey, 0, -1)) // ssd
fmt.Println(c.Get(jpgkey, 0, -1)) // mem
// 添加另一个对象
fmt.Println("add png")
pngkey := md5.Sum([]byte("http://www.test.com/123/456/1.png"))
png := []byte("this is 1.png")
c.AddItem(pngkey, time.Now().Unix()+3600, int64(len(jpg)), httpAuxData{
fileType: crc32.ChecksumIEEE([]byte("png")),
rawKey: []byte("http://www.test.com/123/456/1.png")})
c.AddSegment(pngkey, 0, png)
fmt.Println(c.Get(jpgkey, 0, -1))
// 删除类型为jpg的文件
fmt.Println("Del jpg")
c.DelBatch(func(aux cache.Auxiliary) []cache.Hash {
keys := make([]cache.Hash, 0)
for k, v := range aux.(*httpAux).datas {
if v.fileType == crc32.ChecksumIEEE([]byte("jpg")) {
keys = append(keys, k)
}
}
return keys
})
// 按照正则删除文件
fmt.Println("Del regex")
r := regexp.MustCompile(`http://www.test.com/123/.*png`)
c.DelBatch(func(aux cache.Auxiliary) []cache.Hash {
keys := make([]cache.Hash, 0)
for k, v := range aux.(*httpAux).datas {
if r.Match(v.rawKey) {
fmt.Println("match", string(v.rawKey))
keys = append(keys, k)
}
}
return keys
})
}