memcached_storage.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package remotecache
  2. import (
  3. "time"
  4. "github.com/bradfitz/gomemcache/memcache"
  5. "github.com/grafana/grafana/pkg/setting"
  6. )
  7. const memcachedCacheType = "memcached"
  8. type memcachedStorage struct {
  9. c *memcache.Client
  10. }
  11. func newMemcachedStorage(opts *setting.RemoteCacheOptions) *memcachedStorage {
  12. return &memcachedStorage{
  13. c: memcache.New(opts.ConnStr),
  14. }
  15. }
  16. func newItem(sid string, data []byte, expire int32) *memcache.Item {
  17. return &memcache.Item{
  18. Key: sid,
  19. Value: data,
  20. Expiration: expire,
  21. }
  22. }
  23. // Set sets value to given key in the cache.
  24. func (s *memcachedStorage) Set(key string, val interface{}, expires time.Duration) error {
  25. item := &cachedItem{Val: val}
  26. bytes, err := encodeGob(item)
  27. if err != nil {
  28. return err
  29. }
  30. var expiresInSeconds int64
  31. if expires != 0 {
  32. expiresInSeconds = int64(expires) / int64(time.Second)
  33. }
  34. memcachedItem := newItem(key, bytes, int32(expiresInSeconds))
  35. return s.c.Set(memcachedItem)
  36. }
  37. // Get gets value by given key in the cache.
  38. func (s *memcachedStorage) Get(key string) (interface{}, error) {
  39. memcachedItem, err := s.c.Get(key)
  40. if err != nil && err.Error() == "memcache: cache miss" {
  41. return nil, ErrCacheItemNotFound
  42. }
  43. if err != nil {
  44. return nil, err
  45. }
  46. item := &cachedItem{}
  47. err = decodeGob(memcachedItem.Value, item)
  48. if err != nil {
  49. return nil, err
  50. }
  51. return item.Val, nil
  52. }
  53. // Delete delete a key from the cache
  54. func (s *memcachedStorage) Delete(key string) error {
  55. return s.c.Delete(key)
  56. }