Java秒杀高并发总结

目录

1.CDN静态页面加速

2.redis做后端缓存

3,执行秒杀:

4.瓶颈分析:

5.优化分析:

6.优化总结


秒杀系统优化性能的思路:

写入内存而不是写入硬盘,异步处理而不是同步处理、分布式处理。

1.CDN静态页面加速

2.redis做后端缓存

redis优化地址暴露接口

引入自定义序列化工具(protostuff)序列化java对象到redis。

3,执行秒杀:

原子计数器---redis/nosql (incr限制一个phone/一个session在规定时间内的请求次数)

记录行为消息---分布式MQ

消费消息并落地---MySQL

4.瓶颈分析:

update 减库存 rowLock

|(网络延迟/GC)

insert 购买明细

|(网络延迟/GC)

commit/rollback freeLock

5.优化分析:

行级锁在commit之后释放

  1. 优化方向:减少行级锁持有时间。

  2. 把客户端逻辑放到MYSQL服务器,避免网络延迟和GC的影响。(使用存储过程:整个事务在MySQL断完成)。

简单优化

将insert和update语句调换位置(insert会返回影响的行数)。 因为只有update时才锁,所以将insert放到前面会较少行锁持有时间。

存储过程替代java与Mysql逻辑过程

--秒杀执行存储过程 DELIMITER $$ --console ;转换为 $$ --定义存储过程 --参数: in 输入参数;out 输出参数 --row_cout();返回上一条修改类型sql(delete,insert,update)的影响行数 --row_count();0未修改;>0修改的行数;<0 sql错误 CREATE PROCEDURE seckill.execute_seckill(in v_seckill bitint,in v_phone bigint, in v_kill_time timestamp,out r_result int) BEGIN DECLARE insert_cout int DEFAULT 0; START TRANSACTION; insert ignore into success_killed(seckill_id,user_phone,create_time) values (v_seckill_id,v_phone,v_kill_time); select row_count() into insert_count; IF(insert_count <0) THEN ROLLBACK; set r_resout = -1; ELSEIF(insert_count<0) THEN ROOLBACK; SET R_RESULT = -2; ELSE update seckill set number=number-1 where seckill_id=v_seckill_id and end_time> v_kill_time and start_time< v_kill_time and number>0 into insert_count; IF(inser_count==0) THEN ROLLBACK; set r_result = 0; ELSEIF(insert_count<0) THEN ROLLBACK; set r_result = -2; ELSE COMMIT; set r_result = 1; END IF; END IF; END; $$ DELIMITER ;

set @r_result=-3; call execute_seckill(1003,1350327,new(),@r_result);

select @r_result;

6.优化总结

前端控制:暴露接口,按键防重复(jquery按键防重复one事件)

动静态数据分离:CDN缓存,后端缓存

事务竞争优化:较少事务锁时间

猜你喜欢

转载自blog.csdn.net/sinat_37138973/article/details/85051553