分布式高并发系统设计与分析

 

  • 如何搭建SpringBoot微服务
  • ThreadPoolExecutor线程池的使用
  • ReentrantLock和Synchronized的使用场景
  • 数据库锁机制(悲观锁、乐观锁)
  • 分布式锁(RedissLock、Zookeeper)
  • 进程内消息队列(LinkedBlockingQueue、ArrayBlockingQueue、ConcurrentLinkedQueue)
  • 分布式消息队列(Redis、Kafka)
  • AOP实现切面锁
  • Disruptor高效队列
  • 商品详情页静态化

 

 

 

 

 

case0: 抢红包case

 

0.悲观锁::独占锁(阻塞锁),只有一个线程可以独占这个资源,性能低下

1.乐观锁 :非阻塞锁,基于CAS原理实现

 

但是乐观锁可能会存在ABA问题

乐观锁会存在大量因为版本不一致而导致抢红包失败的请求,也就是最终100个红包,只被抢走了25个。可以通过重入机制进行改善。

 

 

 

2.使用redis抢红包

如何使用redis实现数据不一致的问题。 redis提供的lua脚本,消除了数据不一致性。

 

并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用 version 作为更新依据。

说明:如果每次访问冲突概率小于 20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次 数不得小于 3 次。

 

 

 

 

case1: 秒杀活动

 

posted @ 2018-07-05 15:08  shawshawwan  阅读(219)  评论(0编辑  收藏  举报