memcached_storage.go 1.2 KB

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