redis_storage.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package remotecache
  2. import (
  3. "time"
  4. "github.com/grafana/grafana/pkg/setting"
  5. redis "gopkg.in/redis.v2"
  6. )
  7. const redisCacheType = "redis"
  8. type redisStorage struct {
  9. c *redis.Client
  10. }
  11. func newRedisStorage(opts *setting.RemoteCacheOptions) *redisStorage {
  12. opt := &redis.Options{
  13. Network: "tcp",
  14. Addr: opts.ConnStr,
  15. }
  16. return &redisStorage{c: redis.NewClient(opt)}
  17. }
  18. // Set sets value to given key in session.
  19. func (s *redisStorage) Set(key string, val interface{}, expires time.Duration) error {
  20. item := &cachedItem{Val: val}
  21. value, err := encodeGob(item)
  22. if err != nil {
  23. return err
  24. }
  25. status := s.c.SetEx(key, expires, string(value))
  26. return status.Err()
  27. }
  28. // Get gets value by given key in session.
  29. func (s *redisStorage) Get(key string) (interface{}, error) {
  30. v := s.c.Get(key)
  31. item := &cachedItem{}
  32. err := decodeGob([]byte(v.Val()), item)
  33. if err == nil {
  34. return item.Val, nil
  35. }
  36. if err.Error() == "EOF" {
  37. return nil, ErrCacheItemNotFound
  38. }
  39. if err != nil {
  40. return nil, err
  41. }
  42. return item.Val, nil
  43. }
  44. // Delete delete a key from session.
  45. func (s *redisStorage) Delete(key string) error {
  46. cmd := s.c.Del(key)
  47. return cmd.Err()
  48. }