对于项目中查询、插入、更新、删除操作,其中查询是幂等的,因为多次查询操作对结果是不会有影响的。而其它三个操作中则看你的 sql 语句是如何写的,也就是看你的业务场景来决定这个操作是否是幂等

    项目中常见的:

    • 消息去重
    • 瞬时多个请求

    解决思路:

    • 查询去重

      • 从目标集合中直接查,但是如果目标集合数据量多,查询太慢,负担重
      • 缓存最近N个数据到Redis,设置N个有效时间
      • MySQL创建一个临时表,也只保存N个有效时间,然后定时任务删除
    • 集群中使用分布式锁

      • 集群中不能通过直接查询去重来避免,因为有些消息正在被消费,那么是查不到的,所以只能通过分布式锁,让消息变成有序的
    • 插入操作使用 unique key
      • 数据库使用唯一键来防止重复插入,尽量不要等到了数据库才发现重复,不然回滚的代价就太大了