godis

Go Doc Build Status Go Report codecov License

godis是一个golang实现的redis客户端,参考jedis实现.
godis实现了几乎所有的redis命令,包括单机命令,集群命令,管道命令和事物命令等.
如果你用过jedis,你就能非常容易地上手godis,因为godis的方法命名几乎全部来自jedis.
值得一提的是,godis实现了单机和集群模式下的分布式锁,godis的锁比redisson快很多,在i7,8核32g的电脑测试,10万次for循环,8个线程,业务逻辑是简单的count++,redisson需要18-20秒,而godis只需要7秒左右.
godis已经完成了大多数命令的测试用例,比较稳定.
非常高兴你能提出任何建议,我会积极地迭代这个项目.

特色
  • cluster集群
  • pipeline管道
  • transaction事物
  • distributed lock分布式锁
  • 其他功能在持续开发中
安装
go get -u github.com/piaohao/godis
go.mod
require github.com/piaohao/godis latest
文档 快速开始
package main

import (
    "github.com/piaohao/godis"
)

func main() {
    redis := godis.NewRedis(&godis.Option{
        Host: "localhost",
        Port: 6379,
        Db:   0,
    })
    defer redis.Close()
    redis.Set("godis", "1")
    arr, _ := redis.Get("godis")
    println(arr)
}
package main

import (
    "github.com/piaohao/godis"
)

func main() {
    option:=&godis.Option{
        Host: "localhost",
        Port: 6379,
        Db:   0,
    }
    pool := godis.NewPool(&godis.PoolConfig{}, option)
    redis, _ := pool.GetResource()
    defer redis.Close()
    redis.Set("godis", "1")
    arr, _ := redis.Get("godis")
    println(arr)
}
package main

import (
    "github.com/piaohao/godis"
    "time"
)

func main() {
    option:=&godis.Option{
        Host: "localhost",
        Port: 6379,
        Db:   0,
    }
    pool := godis.NewPool(&godis.PoolConfig{}, option)
    go func() {
        redis, _ := pool.GetResource()
        defer redis.Close()
        pubsub := &godis.RedisPubSub{
            OnMessage: func(channel, message string) {
                println(channel, message)
            },
            OnSubscribe: func(channel string, subscribedChannels int) {
                println(channel, subscribedChannels)
            },
            OnPong: func(channel string) {
                println("recieve pong")
            },
        }
        redis.Subscribe(pubsub, "godis")
    }()
    time.Sleep(1 * time.Second)
    {
        redis, _ := pool.GetResource()
        defer redis.Close()
        redis.Publish("godis", "godis pubsub")
        redis.Close()
    }
    time.Sleep(1 * time.Second)
}
package main

import (
    "github.com/piaohao/godis"
    "time"
)

func main() {
    cluster := godis.NewRedisCluster(&godis.ClusterOption{
        Nodes:             []string{"localhost:7000", "localhost:7001", "localhost:7002", "localhost:7003", "localhost:7004", "localhost:7005"},
        ConnectionTimeout: 0,
        SoTimeout:         0,
        MaxAttempts:       0,
        Password:          "",
        PoolConfig:        &godis.PoolConfig{},
    })
    cluster.Set("cluster", "godis cluster")
    reply, _ := cluster.Get("cluster")
    println(reply)
}
package main

import (
    "github.com/piaohao/godis"
    "time"
)

func main() {
    option:=&godis.Option{
        Host: "localhost",
        Port: 6379,
        Db:   0,
    }
    pool := godis.NewPool(&godis.PoolConfig{}, option)
    redis, _ := pool.GetResource()
    defer redis.Close()
    p := redis.Pipelined()
    infoResp, _ := p.Info()
    timeResp, _ := p.Time()
    p.Sync()
    timeList, _ := timeResp.Get()
    println(timeList)
    info, _ := infoResp.Get()
    println(info)
}
package main

import (
    "github.com/piaohao/godis"
    "time"
)

func main() {
    option:=&godis.Option{
        Host: "localhost",
        Port: 6379,
        Db:   0,
    }
    pool := godis.NewPool(nil, option)
    redis, _ := pool.GetResource()
    defer redis.Close()
    p, _ := redis.Multi()
    infoResp, _ := p.Info()
    timeResp, _ := p.Time()
    p.Exec()
    timeList, _ := timeResp.Get()
    println(timeList)
    info, _ := infoResp.Get()
    println(info)
}
   package main
   
   import (
       "github.com/piaohao/godis"
       "time"
   )
   
   func main() {
       locker := godis.NewLocker(&godis.Option{
             Host: "localhost",
             Port: 6379,
             Db:   0,
         }, &godis.LockOption{
             Timeout: 5*time.Second,
         })
       lock, err := locker.TryLock("lock")
       if err == nil && lock!=nil {
           //do something
           locker.UnLock(lock)
       }
       
   }
   package main
   
   import (
       "github.com/piaohao/godis"
       "time"
   )
   
   func main() {
       locker := godis.NewClusterLocker(&godis.ClusterOption{
       	Nodes:             []string{"localhost:7000", "localhost:7001", "localhost:7002", "localhost:7003", "localhost:7004", "localhost:7005"},
           ConnectionTimeout: 0,
           SoTimeout:         0,
           MaxAttempts:       0,
           Password:          "",
           PoolConfig:        &godis.PoolConfig{},
       },&godis.LockOption{
           Timeout: 5*time.Second,
       })
       lock, err := locker.TryLock("lock")
       if err == nil && lock!=nil {
           //do something
           locker.UnLock(lock)
       }
   }
证书
godis
鸣谢 联系