goredis go语言公共库 goredis

yahayahaya2014-11-04 11:15:41 • 12274 次点击    
这是一个分享于 2014-11-04 11:15:41 的项目,其中的信息可能已经有所发展或是发生改变。

golang redis client, bufferd connection, connection pool, support all redis commands, 欢迎大家批评指正,更欢迎大家加入进来。

Create a new conn?

c, e := Dial("127.0.0.1:6379", pwd, CTimeout, RTimeout, WTimeout, alive, *pool)
if e != nil {
    println(e.Error())
    return
}

如果redis不需要AUTH认证, password =""

A Redis Command.

c.GET("mykey")
c.SADD("mySets", []string{"a","b","c"})
// You can also use this
c.Call(CommandName, arg...)

Pipeline

c.PipeSend("SET", "a", "zyh")
c.PipeSend("SET", "b", "zyh")
c.PipeSend("SET", "c", "zyh")
c.PipeExec()

Transaction

c.MULTI()
c.TransSend("SET", "a", "zyh2")
c.TransSend("SET", "b", "zyh3")
c.TransExec()

Create a new pool?

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)

Create a new multiPool?

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加锁

Add a new pool into multiPool?

mp.AddPool("127.0.0.1:9988", maxConnNum+10, maxIdleSeconds+10)

当有新的pool需要加入到pool中时,可以用该方法,但是如果你是通过对key进行hash,然后选择redis pool的话,会影响数据的一致性

Delete a pool from multiPool?

mp.DelPool("127.0.0.1:9988")

删除一个pool,可以用该方法,但是如果你是通过对key进行hash,然后选择redis pool的话,会影响数据的一致性

Replace a exists pool in multiPool?

mp.ReplacePool("127.0.0.1:9901", "127.0.0.1:9801", 20, 8)

如果需要替换一个redis pool可以用该方法

Use Lua script?

Lua 脚本是针对pool结构的,每个pool有一个script map,使用者可以预先编写好需要用到的脚本,通过script load函数生成sha1
然后,放入map中,下次方便调用,且不用每次都编译,而且可能节省带宽,变相的增加了访问的速度
需要注意的一点是,如果返回lua的table,所以只能是整数,且从1开始顺序的。
具体关于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
}

Todo List

  • Consistent Hash
  • Etc...
Latest commit to the undefined branch on unknown
Download as zip
授权协议:
GPL
开发语言:
golang 查看源码»
12274 次点击  ∙  1 赞  
加入收藏 微博
2 回复  |  直到
xjlfu
xjlfu · #1 · 10年之前

请问,这个项目是thread-safe的吗?

yahayahaya
yahayahaya · #2 · 8年之前
xjlfuxjlfu #1 回复

请问,这个项目是thread-safe的吗?

是的,线程安全的

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传