Golang Redis分布式锁实现

package lock import ( "context" "errors" "cache" "time" "github.com/go-redis/redis/v8" "github.com/google/uuid" ) const ( DefaultExpirationTime = 5 * time.Second RenewInterval = DefaultExpirationTime / 2 // 续租间隔为锁过期时间的一半 LuaCheckAndDelKey = ` if(redis.call('get',KEYS[1])==ARGV[1]) then return redis.call('del',KEYS[1]) else return 0 end ` LuaCheckAndRenewKey = ` if(redis.call('get',KEYS[1])==ARGV[1]) then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end ` ) type RedisLock struct { key string val string expiration time.Duration cli *redis.Client script *redis.Script // 用于解锁的 Lua 脚本 renewScript *redis.Script // 用于续租的 Lua 脚本 stopChan chan struct{} // 用于停止续租 goroutine } func NewRedisLock(key string) *RedisLock { val := uuid.New().String() return &RedisLock{ key: key, val: val, expiration: DefaultExpirationTime, cli: cache.RedisV8Client, script: redis.NewScript(LuaCheckAndDelKey), renewScript: redis.NewScript(LuaCheckAndRenewKey), stopChan: make(chan struct{}), } } func (r *RedisLock) Lock(ctx context.Context)...

八月 14, 2024 · 1 分钟 · 329 字 · ZhangYong

基于Redis的分布式锁算法RedLock及RedLock-Hyperf实现

前言 最近项目需要在Hyperf框架下封装Redis分布式锁,于是基于RedLock算法封装了 RedLock-Hyperf SDK,目前除支持简单对象调用外,也支持在Hyperf框架下通过AOP注解来实现。 基于Redis实现一个分布式锁,相信这对你来说并不是难事。多数人会使用 setnx + expire + del 命令来实现一个简单的分布...

三月 18, 2021 · 8 分钟 · 3725 字 · ZhangYong