对于项目中查询、插入、更新、删除操作,其中查询是幂等的,因为多次查询操作对结果是不会有影响的。而其它三个操作中则看你的 sql 语句是如何写的,也就是看你的业务场景来决定这个操作是否是幂等
项目中常见的:
- 消息去重
- 瞬时多个请求
解决思路:
查询去重
- 从目标集合中直接查,但是如果目标集合数据量多,查询太慢,负担重
- 缓存最近N个数据到Redis,设置N个有效时间
- MySQL创建一个临时表,也只保存N个有效时间,然后定时任务删除
集群中使用分布式锁
- 集群中不能通过直接查询去重来避免,因为有些消息正在被消费,那么是查不到的,所以只能通过分布式锁,让消息变成有序的
- 插入操作使用 unique key
- 数据库使用唯一键来防止重复插入,尽量不要等到了数据库才发现重复,不然回滚的代价就太大了