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