redis_storage.go 1.2 KB

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