一.分析
1.分析现状
(1)我们所作的这个商品的秒杀系统,会有有限的商品数量,在同一时间段内有大量的用户对商品进行下单等相关的操作时会有相当一部分的读写冲突。
(2)可能我们的库存是100份,但相同时间内的流量非常大,超过我们的承受能力。
2.面临的问题
(1)高并发:用户在进行秒杀的时候,可能存在不停刷新页面的情况,用户会用这种方法去了解商品的情况,可这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器和数据库服务器造成负载压力。
(2)超卖:由于库存并发更新的问题,导致在实际库存已经不足的情况下,库存依然在减,导致卖家的商品卖得件数超过秒杀的预期。
二.怎么去做?
1.我们可以把一些经常访问的数据存储到缓存中,这样用户再次去请求访问的时候就是先去访问缓存,缓存中的数据不能满足用户的需求的时候才会去访问数据库,提高访问的速度,也提高了系统秒杀的效率。
2.对于写请求,将所有写请求在缓存中,做请求单队列排队,每次只透过有限的写请求异步写入到数据层,如果均成功再放下一批,如果库存不够则队列里的写请求全部返回“已售完”。(查阅资料看到的,就先写上,具体的没深入了解)
三.具体(按照第二部分(1)来进行)
页面缓存优化
针对对象缓存优化
public MiaoshaUser getById(long id) {
//
MiaoshaUser user = redisService.get(MiaoshaUserKey.getById, ""+id, MiaoshaUser.class);
if(user != null) {
return user;
}
//缓存没有取数据库
user = miaoshaUserDao.getById(id);
if(user != null) {
redisService.set(MiaoshaUserKey.getById, ""+id, user);
}
return user;
}
// 缓存
public boolean updatePassword(String token, long id, String formPass) {
//取user
MiaoshaUser user = getById(id);
if(user == null) {
throw new GlobalException(CodeMsg.MOBILE_NOT_EXIST);
}
//更新数据库 1
MiaoshaUser toBeUpdate = new MiaoshaUser();
toBeUpdate.setId(id);
toBeUpdate.setPassword(MD5Util.formPassToDBPass(formPass, user.getSalt()));
miaoshaUserDao.update(toBeUpdate);
//处理缓存 2
redisService.delete(MiaoshaUserKey.getById, ""+id); // 先把以前的删掉
user.setPassword(toBeUpdate.getPassword());
redisService.set(MiaoshaUserKey.token, token, user); // 再存
return true;
}
之后就是前后端分离(说是去写优化,也不确定要不要写前后端分离,先写一点)
主要是利用AngularJS、Vye.js
前后端分离之后也是对系统的优化,如果前后端不分离会产生传输的重复数据比较多,网络也会有延迟,
分离之后就会解决一部分这方面问题了。