一:为何要进行优化
因为并发的瓶颈在数据库,在优化前我们是对数据库直接进行操作,一旦有多人同时访问,对数据库的优化就会十分缓慢,为了防止、减少这种情况的发生,可以将数据放入到缓存中,即每次查询数据都是先经过缓存,缓存中没有数据的话再对数据库进行操作,这样可以大大提高对数据处理的效率。
二:优化
1.页面缓存
@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;
}
2.对象缓存
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;
}
3.页面静态化
1)商品详情静态化
@RequestMapping(value = "/detail/{goodsId}")
@ResponseBody
public Result<GoodsDetailVo> detail(HttpServletRequest request, HttpServletResponse response, Model model, MiaoshaUser user, @PathVariable("goodsId") long goodsId) {
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
long startAt = goods.getStartDate().getTime(); //转化为毫秒
long endAt = goods.getEndDate().getTime();
long now = System.currentTimeMillis();
int miaoshaStatus = 0; //秒杀状态
int remainSeconds = 0; //距离开始秒杀还有多久
if (now < startAt){ //秒杀还没开始,倒计时
miaoshaStatus = 0;
remainSeconds = (int)((startAt - now)/1000);
}else if (now > endAt){ //秒杀已结束
miaoshaStatus = 2;
remainSeconds = -1;
}else { //秒杀进行中
miaoshaStatus = 1;
remainSeconds = 0;
}
GoodsDetailVo goodsDetailVo = new GoodsDetailVo();
goodsDetailVo.setGoodsVo(goods);
goodsDetailVo.setMiaoshaUser(user);
goodsDetailVo.setMiaoshaStatus(miaoshaStatus);
goodsDetailVo.setRemainSeconds(remainSeconds);
return Result.success(goodsDetailVo);
}