秒杀业务
飞哥,我最近这个问题困扰我很久了。我打算弄个秒杀业务模块,SSM结构的工程。我打算用activeMQ来实现高并发。我遇到一个问题,就是一个Controller发一个消息在队列中,我使用了事务。但是,我后台有大概2000个线程在处理。后台处理时,因为秒杀主要就看库存够不够的问题,所以,有很大一部分秒杀请求,是无法购买成功的,这个时候我希望跳个页面给客户,但是,Controller执行完发消息,就完了。怎么才能让客户知道,自己是否购买成功呢?如果用redis做库存的话,怎么能防止同一个客户的重复秒杀呢?我这里用的是数据库的联合主键,来防止重复秒杀的。飞哥,如果问题描述的不清楚,我希望可以单独聊聊。因为这个问题,困扰我很久,我对大数据处理和并发编程的能力很欠缺,求指导!!!飞哥。。。。秒杀业务这块,你可以先把用户的秒杀请求写入队列,然后根据你的规则读取秒杀请求。
秒杀成功或者失败都可以跳转页面的,跳转一下就好,发完消息,不能跳到一个页面吗?让用户等待之类的也行,然后处理完成之后直接在页面显示就好了。
redis做库存的问题,你在前端用消息队列控制,让用户的请求不能重复就好。
抱歉,这几天比较忙,回复比较慢。你这个问题还没处理好,到时候,可以发下到我邮箱,我看看。 johnny 发表于 2017-12-11 08:58
秒杀业务这块,你可以先把用户的秒杀请求写入队列,然后根据你的规则读取秒杀请求。
秒杀成功或者失败都可 ...
这个问题我明白了!主要还有三个问题。
第一个问题:在不能分库分表的情况下,如果一个数据库的数据量有几百万条,查询效率很低,而且这个数据的数据每天都是增长的,且增长的非常快,这就不太适合做索引那该怎么办?
第二个问题:用mycat分库分表用主键求余的方式得到这条数据改进哪个库,如果某天我要扩容,那么求余的话的顺序就不对了。这样的话会不会影响查询?如果影响的话,我该怎么办?
第三个问题:mysql复合索引使用的注意事项有哪些?
飞哥,求助,这些问题我都不太懂 黑马CJ 发表于 2017-12-15 22:34
这个问题我明白了!主要还有三个问题。
第一个问题:在不能分库分表的情况下,如果一个数据库的数据量有几 ...
1、不太适合做索引,可以做读写分离的配置
2、mycat扩容的,可以看看这两篇文章:用的一致性hash算法搞的
http://blog.csdn.net/ydyang1126/article/details/70773557?locationNum=11&fps=1
http://blog.csdn.net/wangshuang1631/article/details/69055958
3、使用复合索引注意事项:
举个例子:触发复合索引【联合】条件(name,address)--必须有优先查询索引列
select * from person where name=’11’;会触发索引
select * from person wherer name = '11' and address = '22'; 会触发
select * from person wherer name = '11' or address = '22'; 不会触发
select * from person wherer address = '22'; 不会触发
:lol :lol :lol 秒杀解决方案
秒杀
高并发
高可用
高并发:
- 分布式服务、负载均衡、集群
- 保证单个服务的QPS足够高
- 必须尽可能减少单个业务执行时间
订单业务:
- 业务复杂,执行链路较长
- 跨越服务较多
- 写和读操作频繁
执行效率低,并发差
解决思路:减少业务执行时间
- 读操作:加缓存
- 写操作:变同步写为异步写
整个下单业务都变成异步写。
用户请求到达 ---> 先预减库存 ---> 发送一条MQ消息 ---> 返回用户结果
MQ的作用:流量削峰
订单业务,监听MQ,执行下单操作。
核心的预减库存:利用Redis存储库存,在Redis中完成减库存操作
redis如何保证减库存的线程安全?
- 乐观锁方案:Redis事务,watch num;
- Redis的Lua脚本:原子性
前端问题:
- 页面的静态化:动静结合(部分动态数据,依然异步加载)
- 客户端缓存:304,页面缓存在客户端
- Nginx解析缓存:
- 土豪(RMB玩家):CDN服务,html、js、css、image
页:
[1]