github.com/qichengzx/mattermost-server@v4.5.1-0.20180604164826-2c75247c97d0+incompatible/store/redis_supplier.go (about)

     1  // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package store
     5  
     6  import (
     7  	"bytes"
     8  	"encoding/gob"
     9  
    10  	"time"
    11  
    12  	"github.com/go-redis/redis"
    13  	"github.com/mattermost/mattermost-server/mlog"
    14  )
    15  
    16  const REDIS_EXPIRY_TIME = 30 * time.Minute
    17  
    18  type RedisSupplier struct {
    19  	next   LayeredStoreSupplier
    20  	client *redis.Client
    21  }
    22  
    23  func GetBytes(key interface{}) ([]byte, error) {
    24  	var buf bytes.Buffer
    25  	enc := gob.NewEncoder(&buf)
    26  	err := enc.Encode(key)
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  	return buf.Bytes(), nil
    31  }
    32  
    33  func DecodeBytes(input []byte, thing interface{}) error {
    34  	dec := gob.NewDecoder(bytes.NewReader(input))
    35  	return dec.Decode(thing)
    36  }
    37  
    38  func NewRedisSupplier() *RedisSupplier {
    39  	supplier := &RedisSupplier{}
    40  
    41  	supplier.client = redis.NewClient(&redis.Options{
    42  		Addr:     "localhost:6379",
    43  		Password: "",
    44  		DB:       0,
    45  	})
    46  
    47  	if _, err := supplier.client.Ping().Result(); err != nil {
    48  		mlog.Error("Unable to ping redis server: " + err.Error())
    49  		return nil
    50  	}
    51  
    52  	return supplier
    53  }
    54  
    55  func (s *RedisSupplier) save(key string, value interface{}, expiry time.Duration) error {
    56  	if bytes, err := GetBytes(value); err != nil {
    57  		return err
    58  	} else {
    59  		if err := s.client.Set(key, bytes, expiry).Err(); err != nil {
    60  			return err
    61  		}
    62  	}
    63  	return nil
    64  }
    65  
    66  func (s *RedisSupplier) load(key string, writeTo interface{}) (bool, error) {
    67  	if data, err := s.client.Get(key).Bytes(); err != nil {
    68  		if err == redis.Nil {
    69  			return false, nil
    70  		} else {
    71  			return false, err
    72  		}
    73  	} else {
    74  		if err := DecodeBytes(data, writeTo); err != nil {
    75  			return false, err
    76  		}
    77  	}
    78  	return true, nil
    79  }
    80  
    81  func (s *RedisSupplier) SetChainNext(next LayeredStoreSupplier) {
    82  	s.next = next
    83  }
    84  
    85  func (s *RedisSupplier) Next() LayeredStoreSupplier {
    86  	return s.next
    87  }