Redis事务———秒杀案例
模拟用户秒杀
模拟用户秒杀
- 秒杀前 秒杀还未开始,在前台用span标签在秒杀按钮后面显示秒数,用定时器setInterval()传入一千毫秒(一秒)实现每秒减一,减到为0,进行校验,将秒杀按钮颜色提亮,状态变成可点击,最终实现秒杀倒计时得效果;
2 秒杀中 当用户点击秒杀按钮,将用户得id传入后台,使用redis中得sismember(key,vaule)判断用户是否抢过,如果抢过返回失败,如果没抢过进行库存判断是否小于等于零,如果没有则返回秒杀成功; - 秒杀后 秒杀后进行判断库存是否为空,为空则进行前台得效果修改;
Redis事务高并发案例
1.使用ab工具模拟高并发 在高并发得情况下,在一个时间内多个用户点击秒杀按钮,多个用户秒杀成功,可能造成超卖得现象。
2.超卖解决方法使用redis实现事务加锁得方式。
1)watch(key) 监视用户的id
2)开启事务 jedis.mult
3)transaction操作
4)transaction.exec提交
3.造成库存遗留和连接超时性能问题
1)连接超时使用线程池解决性能问题
2)库存遗留问题,主要是用乐观锁实现,查看数据没有问题,但是进行数据的写,由于版本号的问题会照成大量的用户秒杀指令失败,照成不公平,一些比较晚点反而会秒杀成功,使用lua撸啊脚本,将并发请求排成队列,因为lua脚本写好的逻辑会放在redis执行,而redis是单线程,而lua脚本是原子性,当我执行一段逻辑之前不会被其他操作打断,把并发改成了串行。
4.撸啊脚本的局限性
1)lua脚本无法支持redis的集群环境。
2)解决:可以把一个一个的并发请求排队放入list中,左边插入,右边拿出