使用Redis实现秒杀系统防止超卖保护数据库
- 如何减小数据库压力?
使用列表或集合,预先存入n个令牌值,到来的请求使用SPOP或者LPOP拿取令牌,拿到以后才可以进行数据库操作。这可以避免数据库接收到过多的请求; - 如何防止超卖?
- 乐观锁:在表内增加version字段,每次修改时增加对前一次读到的version的判断及新version的更新,如果version不匹配,则修改失败,重读version重试;
- 悲观锁:使用排他锁 - 如何防止恶意多次抢购?
使用SETNX,将用户ID作为键值,如果返回添加成功(1)表示是初次访问,否则拒绝后续访问。为该键值设置过期时间即可限制多久可以访问一次。