deming
2019-01-30 12:14:08 +08:00
锁的粒度控制在用户身上就可以,多个用户同时进来,互不影响,因为锁的粒度在 userId 身上。
利用工具将 一个 userId 并发进来的时候,因为锁的存在也是互斥的。伪代码:
```
addTask(param...){
long userId = getUserId();
//get lock
lockValue=genLockValue();
if(!getLock(userId,lockValue)){
return "some message";
}
//do business
...
releseLock(userId,lockValue);
}
getLock(userId,lockValue){
int retryTime=5;
do{
retryTime--;
redis.setNx(genKey(userId),lockValue);
}while(retryTime>0);
}
releseLock(userId,lockValue){
释放锁的时候判断 key 是这个 key,lockValue 也是这个我的 lockValue 才释放。
否则会错误释放。
}
```