Skip to content

Commit

Permalink
improve: fixed #4
Browse files Browse the repository at this point in the history
  • Loading branch information
flc1125 committed Mar 20, 2023
1 parent 0deb9d5 commit 1a1c0ba
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 30 deletions.
74 changes: 44 additions & 30 deletions manager.go
Expand Up @@ -5,24 +5,26 @@ import (
"sync"
)

// Config is the config of redis.
var alias = map[string]string{
"client": "client",
"cluster": "cluster",
"ring": "ring",
}

type Manager struct {
config *Config
relovedClient map[string]*redis.Client
relovedCluster map[string]*redis.ClusterClient
relovedRing map[string]*redis.Ring
rw sync.RWMutex
config *Config
reloved sync.Map
}

// New a redis manager.
func New(config *Config) *Manager {
return &Manager{
config: config,
relovedClient: make(map[string]*redis.Client),
relovedCluster: make(map[string]*redis.ClusterClient),
relovedRing: make(map[string]*redis.Ring),
rw: sync.RWMutex{},
config: config,
}
}

// Client get client.
func (m *Manager) Client(name ...string) *redis.Client {
if len(name) > 0 {
return m.resolveClient(name[0])
Expand All @@ -31,23 +33,23 @@ func (m *Manager) Client(name ...string) *redis.Client {
return m.resolveClient(m.config.ClientConfig.Default)
}

// resolveClient resolve client.
func (m *Manager) resolveClient(name string) *redis.Client {
if db, ok := m.relovedClient[name]; ok {
return db
if db, ok := m.getReloved(alias["client"], name); ok {
return db.(*redis.Client)
}

if _, ok := m.config.ClientConfig.Connections[name]; !ok {
panic("client connection " + name + " is not defined")
}

m.rw.Lock()
defer m.rw.Unlock()

m.relovedClient[name] = m.config.ClientConfig.Connections[name]()
reloved := m.config.ClientConfig.Connections[name]()
m.setReloved(alias["client"], name, reloved)

return m.relovedClient[name]
return reloved
}

// Cluster get cluster.
func (m *Manager) Cluster(name ...string) *redis.ClusterClient {
if len(name) > 0 {
return m.resolveCluster(name[0])
Expand All @@ -56,23 +58,23 @@ func (m *Manager) Cluster(name ...string) *redis.ClusterClient {
return m.resolveCluster(m.config.ClusterConfig.Default)
}

// resolveCluster resolve cluster.
func (m *Manager) resolveCluster(name string) *redis.ClusterClient {
if db, ok := m.relovedCluster[name]; ok {
return db
if db, ok := m.getReloved(alias["cluster"], name); ok {
return db.(*redis.ClusterClient)
}

if _, ok := m.config.ClusterConfig.Connections[name]; !ok {
panic("cluster connection " + name + " is not defined")
}

m.rw.Lock()
defer m.rw.Unlock()
reloved := m.config.ClusterConfig.Connections[name]()
m.setReloved(alias["cluster"], name, reloved)

m.relovedCluster[name] = m.config.ClusterConfig.Connections[name]()

return m.relovedCluster[name]
return reloved
}

// Ring get ring.
func (m *Manager) Ring(name ...string) *redis.Ring {
if len(name) > 0 {
return m.resolveRing(name[0])
Expand All @@ -81,19 +83,31 @@ func (m *Manager) Ring(name ...string) *redis.Ring {
return m.resolveRing(m.config.RingConfig.Default)
}

// resolveRing resolve ring.
func (m *Manager) resolveRing(name string) *redis.Ring {
if db, ok := m.relovedRing[name]; ok {
return db
if db, ok := m.getReloved(alias["ring"], name); ok {
return db.(*redis.Ring)
}

if _, ok := m.config.RingConfig.Connections[name]; !ok {
panic("ring connection " + name + " is not defined")
}

m.rw.Lock()
defer m.rw.Unlock()
reloved := m.config.RingConfig.Connections[name]()
m.setReloved(alias["ring"], name, reloved)

return reloved
}

// getReloved get reloved.
func (m *Manager) getReloved(prefix, name string) (interface{}, bool) {
return m.reloved.Load(prefix + ":" + name)

}

m.relovedRing[name] = m.config.RingConfig.Connections[name]()
// setReloved set reloved.
func (m *Manager) setReloved(prefix, name string, v interface{}) *Manager {
m.reloved.Store(prefix+":"+name, v)

return m.relovedRing[name]
return m
}
30 changes: 30 additions & 0 deletions manager_test.go
Expand Up @@ -49,3 +49,33 @@ func TestRediser(t *testing.T) {
time.Sleep(time.Second * 3)
assert.Equal(t, "", m.Client().Get(ctx, "aaa").Val())
}

func BenchmarkMap(b *testing.B) {
m := New(&Config{
ClientConfig: &ClientConfig{
Default: "default",
Connections: map[string]ConnectionClientFunc{
"default": func() *redis.Client {
return redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
},
"test": func() *redis.Client {
return redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 1, // use default DB
})
},
},
},
})

b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
go m.Client().Get(ctx, "default").Val()
}
})
}

0 comments on commit 1a1c0ba

Please sign in to comment.