HTTP请求的幂等:

Http请求的 GETHEADPUTDELETE 等方法都是幂等的,而 POST 方法不是。

幂等问题产生原因:

Snipaste_2024-04-03_12-35-28.png

实现幂等的方案:

Spring Boot 实现接口幂等性的 4 种方案!还有谁不会?-CSDN博客
1.数据库唯一主键
2.数据库乐观锁:
image.png
3.防重Token:
image.png
4.分布式锁保证接口幂等:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        RLock lock = redissonClient.getLock(LOCK_USER_REGISTER_KEY + requestParam.getUsername());
try {
// tryLock表示尝试获取锁,获取成功返回true否则返回false
if (lock.tryLock()) {
try {
int inserted = baseMapper.insert(BeanUtil.toBean(requestParam, UserDO.class));
if (inserted < 1) {
throw new ClientException(USER_SAVE_ERROR);
}
} catch (DuplicateKeyException ex) {
throw new ClientException(USER_EXIST);
}
userRegisterCachePenetrationBloomFilter.add(requestParam.getUsername());
groupService.saveGroup(requestParam.getUsername(), "默认分组");
return;
}
throw new ClientException(USER_NAME_EXIST);
} finally {
lock.unlock();
}
}

5.状态机实现幂等: