redis_storage.go 1.1 KB

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