factory.go 1.3 KB
Newer Older
E
eoLinker API Management 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
package redis_manager

import (
	"fmt"
	"github.com/eolinker/goku/common/redis"

	"sort"
)

const (
	_PoolSize = 2000
)

func Create(config RedisConfig) Redis {

	switch config.GetMode() {
	case RedisModeCluster:
		{
			option := &redis.ClusterOptions{
				Addrs:          config.GetAddrs(),
				Password:       config.GetPassword(),
				PoolSize:       2000,
				ReadOnly:       true,
				RouteByLatency: true,
			}

			return &redisProxy{
				Cmdable: redis.NewClusterClient(option),
				config:      config,
			}
		}
	case RedisModeSentinel:
		{

			option := redis.SentinelRingOptions{
				Addrs:    config.GetAddrs(),
				Masters:  config.GetMasters(),
				Password: config.GetPassword(),
				DB:       config.GetDbIndex(),
				PoolSize: _PoolSize,
			}
			return &redisProxy{
				Cmdable: redis.NewSentinelRing(&option),
				config:      config,
			}
		}
	case RedisModeStand:
		{

			addrs := config.GetAddrs()

			option := redis.RingOptions{
				Addrs:    make(map[string]string),
				Password: config.GetPassword(),
				DB:       config.GetDbIndex(),

				PoolSize: _PoolSize,
			}
			sort.Strings(addrs)
			for i, addr := range addrs {
				option.Addrs[fmt.Sprintf("shad:%d", i)] = addr
			}

			return &redisProxy{
				Cmdable: redis.NewRing(&option),
				config:      config,
			}
		}
	}

	return nil
}