秒杀系统的架构设计
秒杀系统,是典型的短时大量突然访问类问题。优化思路:
写入内存而不是写入硬盘(SSD硬盘比传统硬盘的读写性能快100倍,内存比ssd快10倍)
异步处理而不是同步处理(用户请求写入内存立刻返回。后台启动多个线程从内存池中异步读取数据,进行处理)
后台启动多个线程
项目中经常会有后台运行任务的需求,比如发送邮件时,因为要链接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。利用异步处理,通常用消息队列MQ来实现,而redis可以看做是一个高性能的MQ,因为它的数据读写都发生在内存中。分布式处理
MYSQL的秒杀
使用mysql实现秒杀,实现原理是加锁,当多个用户同时对一个字段进行修改时,给数据加锁。只有当事务提交或回滚才会释放锁。for update(加锁)只能放到select中,只有当查询时把数据锁住才有意义。
BEGIN;
INSERT INTO stock_log VALUES
select count from aa where id=1 and count>0 for update;
update bb set count=count-1 where id=1 and count>0;
COMMIT;
mysql事务并发,虽然相比串行,提高了数据库资源利用率,提高了数据库系统的事务吞吐量,从而可以支持更多的用户。
但是会带来一系列问题:更新丢失,脏读,不可重复读