memcached_storage.go 1.3 KB

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