redis 应用-秒杀
操作的数据有两个,一个是商品数量,一个是秒杀成功的用户列表。秒杀成功时 商品数量-1,用户列表+1
如果秒杀用户过多,会导致 redis 连接数过多,redis 可能不能同时支持这么多连接,就会出现连接超时,用连接池解决
秒杀成功的用户列表用 set 保存,保证用户不重复秒杀(参加秒杀时用 sismember 判断是否存在)
商品数量不能超卖,用 redis 乐观锁解决(把商品数量-1,用户列表+1作为一个事务,监视商品数量这个key)
商品数量不能遗留,也就是要卖完,乐观锁能保证不超卖,但是会造成卖不完(乐观锁的版本号机制问题,当多个连接都获取到这个资源时,因为一个连接秒杀成功会修改版本号,导致别的连接就不会成功,就会导致商品卖不完)。可以用 lua 脚本或者代码层面用锁来保证