当前位置:首页 > 编程笔记 > 正文
已解决

Redsync 源码简单分析

来自网友在路上 168868提问 提问时间:2023-11-02 21:13:52阅读次数: 68

最佳答案 问答题库688位专家为你答疑解惑

Redsync 源码简单分析

  • 加锁
  • 自动续期
  • 解锁

加锁

使用 setnx 进行加锁,没有实现分布式锁的可重入性。

func (m *Mutex) acquire(ctx context.Context, pool redis.Pool, value string) (bool, error) {conn, err := pool.Get(ctx)if err != nil {return false, err}defer conn.Close()reply, err := conn.SetNX(m.name, value, m.expiry)if err != nil {return false, err}return reply, nil
}

自动续期

var touchScript = redis.NewScript(1, `if redis.call("GET", KEYS[1]) == ARGV[1] thenreturn redis.call("PEXPIRE", KEYS[1], ARGV[2])elsereturn 0end
`)func (m *Mutex) touch(ctx context.Context, pool redis.Pool, value string, expiry int) (bool, error) {conn, err := pool.Get(ctx)if err != nil {return false, err}defer conn.Close()status, err := conn.Eval(touchScript, m.name, value, expiry)if err != nil {return false, err}return status != int64(0), nil
}

解锁

删除 key 前先判断,防止误删别人的锁。

var deleteScript = redis.NewScript(1, `if redis.call("GET", KEYS[1]) == ARGV[1] thenreturn redis.call("DEL", KEYS[1])elsereturn 0end
`)func (m *Mutex) release(ctx context.Context, pool redis.Pool, value string) (bool, error) {conn, err := pool.Get(ctx)if err != nil {return false, err}defer conn.Close()status, err := conn.Eval(deleteScript, m.name, value)if err != nil {return false, err}return status != int64(0), nil
}
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"Redsync 源码简单分析":http://eshow365.cn/6-30531-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!