分布式锁问题说明
- 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())
- 必须要给分布式锁设置超时时间
lock.New(gRdsClient, topic, nil) 如果不设置超时,一旦进程崩溃,其他进程再也无法获得锁
性能测试:
redis的qps在 10万左右,先写一个脚本进行简单的get操作,验证一下单机qps能否到10万
10万个请求的执行时间在1秒左右,基本生能到redis的性能极限:
- 测试单个进程内不同goroutine 申请同一把分布式锁的性能:
10万次加锁解锁操作耗时9秒左右,qps在一万以上:
- 测试多个进程申请同一把分布式锁的性能:
模拟20个进程同时申请同一把锁,10万次加锁解锁操作总共耗时9秒左右,qps在一万以上: