【页面缓存】
把页面的数据放到reids里面,然后从redis取出后直接返回html
@RequestMapping(value = "/to_list", produces = "text/html")
@ResponseBody
public String toList(HttpServletRequest request, HttpServletResponse response, Model model,
SeckillUser seckillUser) {
// 取缓存
String html = redisService.get(GoodsKey.getGoodsList, "", String.class);
if (!StringUtils.isEmpty(html)) {
return html;
}
List<GoodsVo> goodsList = goodsService.listGoodsVo();
model.addAttribute("goodsList", goodsList);
// 手动渲染 通过ThymeleafResolver
SpringWebContext ctx = new SpringWebContext(request, response, request.getServletContext(), request.getLocale(),
model.asMap(), applicationContext);
html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
if (!StringUtils.isEmpty(html)) {
redisService.set(GoodsKey.getGoodsList, "", html);
}
return html;
}
【URL缓存】
跟页面缓存原理一样,只是根据不同的url参数从缓存中获取不同的页面数据
@RequestMapping(value = "/to_detail/{goodsId}", produces = "text/html")
@ResponseBody
public String detail(HttpServletRequest request, HttpServletResponse response, Model model, SeckillUser seckillUser,
@PathVariable("goodsId") long goodsId) {
// 取缓存
String html = redisService.get(GoodsKey.getGoodsDetail, "" + goodsId, String.class);
if (!StringUtils.isEmpty(html)) {
return html;
}
model.addAttribute("user", seckillUser);
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
model.addAttribute("goods", goods);
long startAt = goods.getStartDate().getTime();
long endAt = goods.getEndDate().getTime();
long now = System.currentTimeMillis();
int seckillStatus = 0;
int remainSeconds = 0;
if (now < startAt) {// 秒杀还没开始,倒计时
seckillStatus = 0;
remainSeconds = (int) ((startAt - now) / 1000);
} else if (now > endAt) {// 秒杀已经结束
seckillStatus = 2;
remainSeconds = -1;
} else {// 秒杀进行中
seckillStatus = 1;
remainSeconds = 0;
}
model.addAttribute("seckillStatus", seckillStatus);
model.addAttribute("remainSeconds", remainSeconds);
// 手动渲染
SpringWebContext ctx = new SpringWebContext(request, response, request.getServletContext(), request.getLocale(),
model.asMap(), applicationContext);
html = thymeleafViewResolver.getTemplateEngine().process("goods_detail", ctx);
if (!StringUtils.isEmpty(html)) {
redisService.set(GoodsKey.getGoodsDetail, "" + goodsId, html);
}
return html;
}
【对象缓存】
对象缓存控制粒度比页面缓存细,但要注意对象变更时缓存值的处理
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 GlobleException(CodeMsg.MOBILE_NOT_EXIST);
}
//更新数据库
MiaoshaUser toBeUpdate = new MiaoshaUser();
toBeUpdate.setId(id);
toBeUpdate.setPassword(MD5Util.formPassToDBPass(formPass,user.getSalt()));
miaoshaUserDao.update(toBeUpdate);
//处理缓存
redisService.delete(MiaoshaUserKey.getById,""+id);
user.setPassword(toBeUpdate.getPassword());
redisService.set(MiaoshaUserKey.token,token,user );
return true;
}
【前后端分离】
现在前端技术有vue,angular很多,也挺容易实现前后端分离的,这里就不再赘述了。
【总结】
redis做缓存很方便,速度快,持久化,相当高级,后续会对整个秒杀核心功能怎么用redis进行优化的。