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

  • 如何搭建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: 秒杀活动

原文地址:https://www.cnblogs.com/shawshawwan/p/9268404.html