1、幂等性是什么?

  • 我们可以借鉴数据库的乐观锁机制;
    • 比如我们执行一条更新库存的SQL语句
    • UPDATE T_DEPS SET COUNT= COUNT-1 ,VERSION = VERSION+1 WHERE VERSION = 1;
  • 每次更新时都进行版本的+1操作,这样别的操作再来对上一个版本的数据进行更新就会更新失败,找不到之前的数据了。
  • ==一句话==:多线程对一件事情执行一个操作,这个操作可能执行100次,1000次,最终的结果都是相同的。

2、消费端-幂等性保障

2.1、在海量订单产生的业务高峰期,如何避免消息的重复消费问题?

  • 消费端实现幂等性,就意味着,我们的消息永远不会消费多次,即使我们收到了多条一样的消息。

2.2、业界主流的幂等性操作

  • 唯一ID+指纹码 机制,利用数据库主键去重
    • select count(1) from t_order where ID = 唯一ID + 指纹码
    • 好处:实现简单;
    • 坏处:高并发下有数据库写入的性能瓶颈;
    • 解决方案:跟进ID进行分库分表进行算法路由。
  • 利用Redis的原子性去实现。
    • 使用Redis进行幂等,需要考虑的问题:
      • 第一:我们是否要进行数据落库,如果落库的话,关键解决的问题是数据库和缓存如何做到原子性?
      • 第二:如果不进行落库,那么都存储到缓存中,如何设置定时同步的策略。

3、Redis的原子性

  • Redis是单进程单线程的网络模型,用的是epoll网络模型,网络模型都是单线程异步非阻塞处理网络请求 ;
  • Redis提供的所有API操作,相对于服务端方面都是one by one执行的,命令是一个接着一个执行的,不存在并行执行的情况。
  • Redis的单线程处理所有的客户端连接请求,命令读写请求