秒杀原理
秒杀系统,是典型的短时大量突发访问类问题。对这类问题,有三种优化性能的思路:
写入内存而不是写入硬盘
异步处理而不是同步处理
分布式处理
页面缓存:
@RequestMapping(value = "/to_list", produces = "text/html")
@ResponseBody
public String list(HttpServletRequest request, HttpServletResponse response, Model model, MiaoshaUser user){
model.addAttribute("user", user);
//取缓存
String html = myRedisUtil.get(GoodsKey.getGoodsList, "", String.class);
if (!StringUtils.isEmpty(html)){
return html;
}
//查询商品列表,包括商品和秒杀商品
List<GoodsVo> goodsList = goodsService.listGoodsVo();
model.addAttribute("goodsList", goodsList); //放到Model中,供前端展示使用。
// return "goods_list";
//手动渲染
IWebContext ctx =new WebContext(request,response,
request.getServletContext(),request.getLocale(),model.asMap());
html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
if (!StringUtils.isEmpty(html)){
myRedisUtil.set(GoodsKey.getGoodsList, "", html);
}
return html;
}
对象缓存
public MiaoshaUser getById(long id){
//取缓存
MiaoshaUser miaoshaUser = myRedisUtil.get(MiaoshaUserKey.getById, ""+id, MiaoshaUser.class);
if (miaoshaUser != null){
return miaoshaUser;
}
//取数据库
miaoshaUser = miaoshaUserMapper.getById(id);
if (miaoshaUser != null){
myRedisUtil.set(MiaoshaUserKey.getById, ""+id, miaoshaUser);
}
return miaoshaUser;
}
public boolean updatePassword(String token, long id, String formPass){
//取user
MiaoshaUser miaoshaUser = getById(id);
if (miaoshaUser == null){
throw new GlobalException(CodeMsg.MOBILE_NOT_EXIST);
}
//更新数据库
MiaoshaUser toBeUpdate = new MiaoshaUser();
toBeUpdate.setId(id);
toBeUpdate.setPassword(MD5Util.formPassToDBPass(formPass, miaoshaUser.getSalt()));
miaoshaUserMapper.update(toBeUpdate);
//处理缓存
myRedisUtil.delete(MiaoshaUserKey.getById, ""+id);
miaoshaUser.setPassword(toBeUpdate.getPassword());
myRedisUtil.set(MiaoshaUserKey.token, token, miaoshaUser);
return true;
}