转载

godis v0.0.10 发布,Go 语言的 redis 客户端开发包

godis

godis是一个golang实现的redis客户端,参考jedis实现.

godis实现了几乎所有的redis命令,包括单机命令,集群命令,管道命令和事物命令等.

如果你用过jedis,你就能非常容易地上手godis,因为godis的方法命名几乎全部来自jedis.

值得一提的是,godis实现了单机和集群模式下的分布式锁,godis的锁比redisson快很多,在i7,8核32g的电脑测试,10万次for循环,8个线程,业务逻辑是简单的count++,reidsson需要18-20秒,而godis只需要7秒左右.

godis已经完成了大多数命令的测试用例,比较稳定.

非常高兴你能提出任何建议,我会积极地迭代这个项目.

  • github地址: https://github.com/piaohao/godis
  • gitee地址: https://gitee.com/piaohao/godis

特色

  • cluster集群
  • pipeline管道
  • transaction事物
  • distributed lock分布式锁
  • 其他功能在持续开发中

安装

go get -u github.com/piaohao/godis

或者使用 go.mod :

require github.com/piaohao/godis latest

文档

  • ApiDoc

快速开始

  1. 基本例子

    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(string(arr))
     }
  2. 使用连接池

    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(string(arr))
     }
  3. 发布订阅

    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)
     }
  4. cluster集群

    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)
     }
  5. pipeline管道

    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)
     }
  6. transaction事物

    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)
     }
  7. distribute lock分布式锁

    • single redis

      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)
                }
      
            }
    • redis cluster

      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 使用的是MIT License, 永远100%免费和开源.

鸣谢

  • jedis,java非常出名的redis客户端
  • gf,功能非常强大的go web框架
  • go-commons-pool,参照apache common-pool实现的go连接池

联系

piao.hao@qq.com

原文  https://www.oschina.net/news/107884/godis-0-0-10-released
正文到此结束
Loading...