Golang:redis lua lib

go-lualib

仓库地址

https://github.com/jyz1024/go-lualib

使用方式

初始化

使用连接池

// 参数需要实现lualib.connPool 接口
// 或者提供“Get() interface{}”发放,Get返回接口实现Conn接口
type connPool interface {
	Get() Conn
}
type Conn interface {
	Do(string, ...interface{}) (interface{}, error)
	Close() error
}

func main(){
   defer func() {
        if r := recover(); r != nil {
            log.Println("load lua lib panic:", r)
        }
    }()
    lualib.LoadLuaLibWithPool(poolImpl)
}

使用连接

conn需要实现connDo接口

type connDo interface {
	Do(string, ...interface{}) (interface{}, error)
}
func main() {
   defer func() {
        if r := recover(); r != nil {
            log.Println("load lua lib panic:", r)
        }
    }()
    lualib.LoadLuaLibWithConn(conn)
 }

调用方式

  1. 直接调用Eval执行脚本
    func main() {
       /******** get string key *********/
       singleValRes, err := lualib.Exec(`return redis.call("Get",KEYS[1])`, 1, "strkey")
        // set strkey 111
        // res type:[]uint8,err:<nil>
        log.Printf("res type:%T, res val:%v, err:%v\n", singleValRes, singleValRes, err)
    } 
    
  2. RegisterScript + CallScript
    func main() {
    err := lualib.RegisterScript("GetVal", `return redis.call("Get",KEYS[1])`, 1)
       if err != nil {
           log.Println("register error:", err.Error())
       }
       res, err := lualib.CallScript("GetVal", "casKey")
       if err != nil {
           log.Println("err:", err.Error())
       } else {
           log.Println(res)
       }
      } 
    
  3. 使用库本身提供的CompareAndSwap等方法
    func main() {
       res, err := lualib.HMIncrBy("hashkey", []interface{}{"1", "2"}, []interface{}{10, -2})
       log.Printf("val:%v type:%T",res,res)
       if err != nil {
           if err == lualib.ErrInsufficient {
               log.Println("ErrInsufficient")
           } else {
               log.Println("incrby error:", err.Error())
           }
       } else {
           log.Println("incrby success:", res)
       }
    }
    

redis.call(…argv)

  • redis.call(“Get”,“key”); boolean:false/string:“val” // tonumber(boolean) == nil
  • redis.call(“IncrBy”,“key”,1); number
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值