Этот коммит содержится в:
Corey Hulen
2017-02-15 19:25:33 -05:00
коммит произвёл Joram Wilander
родитель 727d067fce
Коммит 01a8114aa3
4 изменённых файлов: 46 добавлений и 5 удалений

Просмотреть файл

@@ -211,7 +211,7 @@ func deleteEmoji(c *Context, w http.ResponseWriter, r *http.Request) {
} }
var emoji *model.Emoji var emoji *model.Emoji
if result := <-app.Srv.Store.Emoji().Get(id); result.Err != nil { if result := <-app.Srv.Store.Emoji().Get(id, false); result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return
} else { } else {
@@ -269,7 +269,7 @@ func getEmojiImage(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
if result := <-app.Srv.Store.Emoji().Get(id); result.Err != nil { if result := <-app.Srv.Store.Emoji().Get(id, true); result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return
} else { } else {
@@ -288,6 +288,7 @@ func getEmojiImage(c *Context, w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "image/"+imageType) w.Header().Set("Content-Type", "image/"+imageType)
} }
w.Header().Set("Cache-Control", "max-age=2592000, public")
w.Write(img) w.Write(img)
} }
} }

Просмотреть файл

@@ -4,9 +4,18 @@
package store package store
import ( import (
"github.com/mattermost/platform/einterfaces"
"github.com/mattermost/platform/model" "github.com/mattermost/platform/model"
"github.com/mattermost/platform/utils"
) )
const (
EMOJI_CACHE_SIZE = 5000
EMOJI_CACHE_SEC = 1800 // 60 mins
)
var emojiCache *utils.Cache = utils.NewLru(EMOJI_CACHE_SIZE)
type SqlEmojiStore struct { type SqlEmojiStore struct {
*SqlStore *SqlStore
} }
@@ -58,11 +67,32 @@ func (es SqlEmojiStore) Save(emoji *model.Emoji) StoreChannel {
return storeChannel return storeChannel
} }
func (es SqlEmojiStore) Get(id string) StoreChannel { func (es SqlEmojiStore) Get(id string, allowFromCache bool) StoreChannel {
storeChannel := make(StoreChannel, 1) storeChannel := make(StoreChannel, 1)
go func() { go func() {
result := StoreResult{} result := StoreResult{}
metrics := einterfaces.GetMetricsInterface()
if allowFromCache {
if cacheItem, ok := emojiCache.Get(id); ok {
if metrics != nil {
metrics.IncrementMemCacheHitCounter("Emoji")
}
result.Data = cacheItem.(map[string]*model.Emoji)
storeChannel <- result
close(storeChannel)
return
} else {
if metrics != nil {
metrics.IncrementMemCacheMissCounter("Emoji")
}
}
} else {
if metrics != nil {
metrics.IncrementMemCacheMissCounter("Emoji")
}
}
var emoji *model.Emoji var emoji *model.Emoji
@@ -77,6 +107,10 @@ func (es SqlEmojiStore) Get(id string) StoreChannel {
result.Err = model.NewLocAppError("SqlEmojiStore.Get", "store.sql_emoji.get.app_error", nil, "id="+id+", "+err.Error()) result.Err = model.NewLocAppError("SqlEmojiStore.Get", "store.sql_emoji.get.app_error", nil, "id="+id+", "+err.Error())
} else { } else {
result.Data = emoji result.Data = emoji
if allowFromCache {
emojiCache.AddWithExpiresInSecs(id, emoji, EMOJI_CACHE_SEC)
}
} }
storeChannel <- result storeChannel <- result

Просмотреть файл

@@ -74,7 +74,13 @@ func TestEmojiGet(t *testing.T) {
}() }()
for _, emoji := range emojis { for _, emoji := range emojis {
if result := <-store.Emoji().Get(emoji.Id); result.Err != nil { if result := <-store.Emoji().Get(emoji.Id, false); result.Err != nil {
t.Fatalf("failed to get emoji with id %v: %v", emoji.Id, result.Err)
}
}
for _, emoji := range emojis {
if result := <-store.Emoji().Get(emoji.Id, true); result.Err != nil {
t.Fatalf("failed to get emoji with id %v: %v", emoji.Id, result.Err) t.Fatalf("failed to get emoji with id %v: %v", emoji.Id, result.Err)
} }
} }

Просмотреть файл

@@ -304,7 +304,7 @@ type PasswordRecoveryStore interface {
type EmojiStore interface { type EmojiStore interface {
Save(emoji *model.Emoji) StoreChannel Save(emoji *model.Emoji) StoreChannel
Get(id string) StoreChannel Get(id string, allowFromCache bool) StoreChannel
GetByName(name string) StoreChannel GetByName(name string) StoreChannel
GetAll() StoreChannel GetAll() StoreChannel
Delete(id string, time int64) StoreChannel Delete(id string, time int64) StoreChannel