分布式锁问题说明

  1. redis-lock库的randomToken函数未设置随机种子

会导致不同进程随机出来的结果完全是一样的,这会导致两个进程有概率获得相同的key,引发严重错误

分布式锁问题说明

 

go run test_random.go|sort|uniq >/tmp/vv1

go run test_random.go|sort|uniq >/tmp/vv2

对比两个结果,完全一样

给随机函数加上种子即可解决 rand.Seed(time.Now().UnixNano())

 

  1. 必须要给分布式锁设置超时时间

lock.New(gRdsClient, topic, nil)  如果不设置超时,一旦进程崩溃,其他进程再也无法获得锁

 

 

 

性能测试:

redis的qps在 10万左右,先写一个脚本进行简单的get操作,验证一下单机qps能否到10万

分布式锁问题说明

 

 

 

10万个请求的执行时间在1秒左右,基本生能到redis的性能极限:

 

分布式锁问题说明

 

  1. 测试单个进程内不同goroutine 申请同一把分布式锁的性能:

 

分布式锁问题说明

分布式锁问题说明正在上传…重新上传取消

 

10万次加锁解锁操作耗时9秒左右,qps在一万以上:

 

分布式锁问题说明

分布式锁问题说明正在上传…重新上传取消

 

  1. 测试多个进程申请同一把分布式锁的性能:

分布式锁问题说明

 

 

 

模拟20个进程同时申请同一把锁,10万次加锁解锁操作总共耗时9秒左右,qps在一万以上:

分布式锁问题说明分布式锁问题说明