用户注册 -采用分布式锁来防止大量并发请求抢占同一个用户名
controller
@PostMapping("/api/short-link/admin/v1/user")
public Result<Void> register(@RequestBody UserRegisterReqDTO requestParam) {
userService.register(requestParam);
return Results.success();
}
service
@Transactional(rollbackFor = Exception.class)
@Override
public void register(UserRegisterReqDTO requestParam) {
if (!hasUsername(requestParam.getUsername())) {
throw new ClientException(USER_NAME_EXIST);
}
RLock lock = redissonClient.getLock(LOCK_USER_REGISTER_KEY + requestParam.getUsername());
if (!lock.tryLock()) {
throw new ClientException(USER_NAME_EXIST);
}
try {
int inserted = baseMapper.insert(BeanUtil.toBean(requestParam, UserDO.class));
if (inserted < 1) {
throw new ClientException(USER_SAVE_ERROR);
}
groupService.saveGroup(requestParam.getUsername(), "默认分组");
userRegisterCachePenetrationBloomFilter.add(requestParam.getUsername());
} catch (DuplicateKeyException ex) {
throw new ClientException(USER_EXIST);
} finally {
lock.unlock();
}
}