golang redis连接池式分布式锁小小的封装
2019-08-14 16:14
1546 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39998006/article/details/99579473
摘要:把redis加锁方法单独抽离出去放入一个公共方法,暂未做数据类型断言
helper redisLock 文件
package helper import ( "fmt" "github.com/garyburd/redigo/redis" "github.com/prometheus/common/log" ) type Lock struct { resource string token int64 conn redis.Pool timeout int } func (lock *Lock) tryLock() (ok bool, err error) { _, err = redis.String(lock.conn.Get().Do("SET", lock.key(), lock.token, "EX", int(lock.timeout), "NX")) if err == redis.ErrNil { // The lock was not successful, it already exists. return false, nil } if err != nil { return false, err } return true, nil } func (lock *Lock) Unlock() (err error) { _, err = lock.conn.Get().Do("del", lock.key()) return } func (lock *Lock) Close() (err error) { if lock != nil { lock.conn.Close() } return } func (lock *Lock) key() string { return fmt.Sprintf("redislock:%s", lock.resource) } func (lock *Lock) AddTimeout(ex_time int64) (ok bool, err error) { ttl_time, err := redis.Int64(lock.conn.Get().Do("TTL", lock.key())) fmt.Println(ttl_time) if err != nil { log.Fatal("redis get failed:", err) } if ttl_time > 0 { fmt.Println(11) _, err := redis.String(lock.conn.Get().Do("SET", lock.key(), lock.token, "EX", int(ttl_time+ex_time))) if err == redis.ErrNil { return false, nil } if err != nil { return false, err } } return false, nil } func (lock *Lock) Get(key string) int64 { sum, err := redis.Int64(lock.conn.Get().Do("TTL", lock.resource)) if err != nil { log.Fatal("redis get failed:", err) } return sum } func TryLockWithTimeout(conn redis.Pool, resource string, token int64, timeout int) (lock *Lock, ok bool, err error) { lock = &Lock{resource, token, conn, timeout} ok, err = lock.tryLock() if !ok || err != nil { lock = nil } return } func TryLock(conn redis.Pool, key string, value int64, DefaulTimeout int) (lock *Lock, ok bool, err error) { return TryLockWithTimeout(conn, key, value, DefaulTimeout) }
调用(有一些无用import我懒得删了,复制粘贴自行删除)
package main import ( "apitest/helper" "context" "flag" "fmt" "github.com/garyburd/redigo/redis" "github.com/panjf2000/ants" "github.com/rpcx-ecosystem/rpcx-examples3" "github.com/smallnest/rpcx/client" "log" "net/http" "time" ) var redisPool = &redis.Pool{ MaxIdle: 30, MaxActive: 1000, IdleTimeout: 30 * time.Second, Dial: func() (conn redis.Conn, err error) { //RedisHost := "127.0.0.1:6379" //连接地址 //RedisPassword := "" //连接密码 return redis.Dial("tcp", "127.0.0.1:32769") }, } func main() { //redisPool.Close() rs := redisPool //defer rs.Close() res, ok, err := helper.TryLock(*rs, "key", 0, 12) //res, ok, err := TryLock(*rs, "key", 0, 12) if err != nil { panic(err) } if ok { fmt.Println("加锁成功") res.Unlock() } else { fmt.Println("加锁失败") } res.Close() }
相关文章推荐
- nodejs连接redis数据库简单封装-redis模块
- 连接redis数据库 详解 (jedis工具类封装讲解特别好)
- Golang绑定Lua脚本,小小封装一下
- Redis客户端连接方式Hiredis简单封装使用,连接池、屏蔽连接细节
- golang连接redis
- redis集群 - 使用php连接redis集群、redis自定义命令封装
- nodejs连接redis数据库简单封装-redis模块
- nodejs连接redis数据库简单封装-redis模块
- redis客户端连接,最大连接数查询与设置
- 新浪云web项目数据库连接及 封装
- 使用Jedis连接Redis的两种方式
- 把redis源码的linux网络库提取出来,自己封装成通用库使用(★firecat推荐★)
- NET access连接数据库封装
- Java连接Redis数据库 事务、管道和分布式的调用方式
- java(JDBC连接数据库)[完整版封装]
- python 连接 redis
- 分布式锁实现方案2、基于Redis的SET操作实现的分布式锁
- Redis PHP连接操作
- golang设置socket的连接超时
- 最简单的Redis客户端实现——Golang