Redis 黑马点评-优惠券秒杀
1.全局唯一ID:订单的id
2.实现秒杀下单
3.超卖问题
4.一人一单功能:加锁 synchronized
intern():字符串常量池。字符串的值相同,就锁的是同一个对象。因为toString底层是new字符串。
5.集群下的线程并发安全问题
重新加载nginx : nginx.exe -s reload
由于内存隔离,在集群模式下,不同的jvm的锁监视器不同,创建的字符串常量池不同。
解决方案:分布式锁
6.分布式锁:jdk之外的锁
6.1基本原理和不同实现方式对比
6.2Redis的分布式锁的实现思路:setnx
6.2实现Redis分布式锁版本1
6.3锁误删:删之前加判断条件,是自己的锁才能删
6.4原子性问题:判断锁和释放锁成原子操作
获取标识后,就在准备释放锁的时候出现阻塞。判断锁和释放锁要成原子操作。
6.5Lua脚本解决多条命令原子性问题
6.6Java调用Lua脚本改造分布式锁
7.Redission:基于Redis的分布式锁
7.1Redission功能介绍
7.2Redission快速入门
7.3Redisson的可重入锁的原理
使用哈希结构,value用来存储当前线程获取锁的次数
获取锁Lua脚本
释放锁Lua脚本
7.4Redisson锁可重试和WatchDog机制
tryLock():可以传递三个参数,等待时间、锁持有时间、时间单位
leaseTime不传会给一个-1,释放时间会给一个默认值,3
7.5Redisson的multiLock原理
8.秒杀优化
8.1 异步秒杀思路
由于串行操作,对数据库操作次数多,响应时间长。
优化:判断业务交给redis,判断完毕之后保存到队列中,创建线程异步操作数据库。
同步变异步
8.2基于redis完成秒杀资格判断
①将优惠券信息保存到Redis中
②seckill.lua脚本:扣减库存、一人一单
③如果抢购成功,将优惠券id和用户id封装后存入阻塞队列
8.3基于阻塞队列实现秒杀异步功能
9.消息队列
9.1认识消息队列
9.2基于List实现消息队列
9.3PubSub实现消息队列
9.4Stream