经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
[Go] redis分布式锁的go-redis实现
来源:cnblogs  作者:陶士涵  时间:2020/12/14 17:25:36  对本文有异议

在分布式的业务中 , 如果有的共享资源需要安全的被访问和处理 , 那就需要分布式锁

分布式锁的几个原则;

1.「锁的互斥性」:在分布式集群应用中,共享资源的锁在同一时间只能被一个对象获取。

2. 「可重入」:为了避免死锁,这把锁是可以重入的,并且可以设置超时。

3. 「高效的加锁和解锁」:能够高效的加锁和解锁,获取锁和释放锁的性能也好。

4. 「阻塞、公平」:可以根据业务的需要,考虑是使用阻塞、还是非阻塞,公平还是非公平的锁。

 

redis实现分布式锁主要靠setnx命令

1. 当key存在时失败 , 保证互斥性

2.设置了超时 , 避免死锁

3.利用mutex保证当前程序不存在并发冲突问题

  1. package redis
  2. import (
  3. "context"
  4. "github.com/go-redis/redis/v8"
  5. "github.com/taoshihan1991/miaosha/setting"
  6. "log"
  7. "sync"
  8. "time"
  9. )
  10. var rdb *redis.Client
  11. var ctx = context.Background()
  12. var mutex sync.Mutex
  13. func NewRedis() {
  14. rdb = redis.NewClient(&redis.Options{
  15. Addr: setting.Redis.Ip + ":" + setting.Redis.Port,
  16. Password: "", // no password set
  17. DB: 0, // use default DB
  18. })
  19. }
  20. func Lock(key string) bool {
  21. mutex.Lock()
  22. defer mutex.Unlock()
  23. bool, err := rdb.SetNX(ctx, key, 1, 10*time.Second).Result()
  24. if err != nil {
  25. log.Println(err.Error())
  26. }
  27. return bool
  28. }
  29. func UnLock(key string) int64 {
  30. nums, err := rdb.Del(ctx, key).Result()
  31. if err != nil {
  32. log.Println(err.Error())
  33. return 0
  34. }
  35. return nums
  36. }

 

原文链接:http://www.cnblogs.com/taoshihan/p/14110353.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号