golang redis client, bufferd connection, connection pool, support all redis commands, 欢迎大家批评指正,更欢迎大家加入进来。
c, e := Dial("127.0.0.1:6379", pwd, CTimeout, RTimeout, WTimeout, alive, *pool) if e != nil { println(e.Error()) return }
如果redis不需要AUTH认证, password =""
c.GET("mykey") c.SADD("mySets", []string{"a","b","c"}) // You can also use this c.Call(CommandName, arg...)
c.PipeSend("SET", "a", "zyh") c.PipeSend("SET", "b", "zyh") c.PipeSend("SET", "c", "zyh") c.PipeExec()
c.MULTI() c.TransSend("SET", "a", "zyh2") c.TransSend("SET", "b", "zyh3") c.TransExec()
p := NewPool("127.0.0.1:6379", "", maxConnNum, maxIdleSeconds) // get a new conn c := p.Pop() if c == nil{ fmt.Println("get a nil conn") } defer p.Push(c)
addresses := []string{"127.0.0.1:6379", "127.0.0.1:9991@1"} mp := NewMultiPool(addresses, maxConnNum, maxIdleSeconds) addr := "127.0.0.1:6379" c := mp.PopByAddr(addr) mp.PushByAddr(addr, c) key := "myhashes" c = mp.PopByKey(key) mp.PushByKey(key, c) // mp.Push(c)
PopByKey和PushByKey是对参数key进行hash,然后选出固定的redis。你可以使用自己的hash算法,具体实现在Sum函数中。 AddPool函数,会在multiPool中新加入一个Pool,maxConnNum和maxIdleSeconds可以和初始化multiPool的时候不同, 或者直接 mp.Push(c) 会自动去找到应该放入的Pool中 注意:必须在init的时候按顺序添加不同参数的Pool,因为multiPool里面没有对pool slice加锁
mp := NewMultiPool(addresses, maxConnNum, maxIdleSeconds) mp.CallOnce(address).SET("Key","Value")
mp.Info() // 通过该接口可以得到关于连接池的相关信息,有助于你对程序运行状况的了解 // idle,active,qps,create,createFailed,等等信息
mp.AddPool("127.0.0.1:9988", maxConnNum+10, maxIdleSeconds+10)
当有新的pool需要加入到pool中时,可以用该方法,但是如果你是通过对key进行hash,然后选择redis pool的话,会影响数据的一致性
mp.AddPool("127.0.0.1:9988", maxConnNum+10, maxIdleSeconds+10)
当有新的pool需要加入到pool中时,可以用该方法,但是如果你是通过对key进行hash,然后选择redis pool的话,会影响数据的一致性
mp.DelPool("127.0.0.1:9988")
删除一个pool,可以用该方法,但是如果你是通过对key进行hash,然后选择redis pool的话,会影响数据的一致性
mp.ReplacePool("127.0.0.1:9901", "127.0.0.1:9801", 20, 8)
如果需要替换一个redis pool可以用该方法
具体关于redis lua的说明请参考http://redis.io/commands/eval
p := NewPool("10.16.15.121:9731", "", 10, 10) c := p.Pop() if c == nil { return }
scriptA := ` local ttl = redis.call("ttl",KEYS[1]) local key = redis.call("get",KEYS[1]) local rTable = {} rTable[1] = ttl rTable[2] = key return rTable ` sha1, e := c.SCRIPTLOAD(scriptA) if e != nil { fmt.Println("script load error = ", e.Error()) return }
- Consistent Hash
- Etc...