package com.jesper.seckill.controller;
import com.alibaba.druid.util.StringUtils;
import com.jesper.seckill.bean.User;
import com.jesper.seckill.redis.GoodsKey;
import com.jesper.seckill.redis.RedisService;
import com.jesper.seckill.result.Result;
import com.jesper.seckill.service.GoodsService;
import com.jesper.seckill.service.UserService;
import com.jesper.seckill.vo.GoodsDetailVo;
import com.jesper.seckill.vo.GoodsVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.spring4.context.SpringWebContext;
import org.springframework.context.ApplicationContext;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* Created by jiangyunxiong on 2018/5/22.
*/
@Controller
@RequestMapping("/goods")
public class GoodsController {
@Autowired
UserService userService;
@Autowired
RedisService redisService;
@Autowired
GoodsService goodsService;
@Autowired
ApplicationContext applicationContext;
@Autowired
ThymeleafViewResolver thymeleafViewResolver;
/**
* 商品列表页面
* QPS:433
* 1000 * 10
*/
@RequestMapping(value = "/to_list", produces = "text/html")
@ResponseBody
public String list(HttpServletRequest request, HttpServletResponse response, Model model, User user) {
//取缓存
String html = redisService.get(GoodsKey.getGoodsList, "", String.class);
if (!StringUtils.isEmpty(html)) {
return html;
}
List<GoodsVo> goodsList = goodsService.listGoodsVo();
model.addAttribute("user", user);
model.addAttribute("goodsList", goodsList);
//手动渲染
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;
}
/**
* 商品详情页面
*/
@RequestMapping(value = "/to_detail2/{goodsId}", produces = "text/html")
@ResponseBody
public String detail2(HttpServletRequest request, HttpServletResponse response, Model model, User user, @PathVariable("goodsId") long goodsId) {
model.addAttribute("user", user);
//取缓存
String html = redisService.get(GoodsKey.getGoodsDetail, "" + goodsId, String.class);
if (!StringUtils.isEmpty(html)) {
return html;
}
//根据id查询商品详情
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
model.addAttribute("goods", goods);
long startTime = goods.getStartDate().getTime();
long endTime = goods.getEndDate().getTime();
long now = System.currentTimeMillis();
int seckillStatus = 0;
int remainSeconds = 0;
if (now < startTime) {//秒杀还没开始,倒计时
seckillStatus = 0;
remainSeconds = (int) ((startTime - now) / 1000);
} else if (now > endTime) {//秒杀已经结束
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;
}
/**
* 商品详情页面
*/
@RequestMapping(value = "/detail/{goodsId}")
@ResponseBody
public Result<GoodsDetailVo> detail(HttpServletRequest request, HttpServletResponse response, Model model, User user, @PathVariable("goodsId") long goodsId) {
//根据id查询商品详情
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
model.addAttribute("goods", goods);
long startTime = goods.getStartDate().getTime();
long endTime = goods.getEndDate().getTime();
long now = System.currentTimeMillis();
int seckillStatus = 0;
int remainSeconds = 0;
if (now < startTime) {//秒杀还没开始,倒计时
seckillStatus = 0;
remainSeconds = (int) ((startTime - now) / 1000);
} else if (now > endTime) {//秒杀已经结束
seckillStatus = 2;
remainSeconds = -1;
} else {//秒杀进行中
seckillStatus = 1;
remainSeconds = 0;
}
GoodsDetailVo vo = new GoodsDetailVo();
vo.setGoods(goods);
vo.setUser(user);
vo.setRemainSeconds(remainSeconds);
vo.setSeckillStatus(seckillStatus);
return Result.success(vo);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于SpringBoot + MySQL + Redis + RabbitMQ + Guava开发的高并发商品限时秒杀系统 项目经过严格测试,确保可以运行!源码无需做任何更改! 系统介绍 本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具 IntelliJ IDEA + Navicat + Sublime Text3 + Git + Chrome 压测工具 JMeter 开发技术 前端技术 :Bootstrap + jQuery + Thymeleaf 后端技术 :SpringBoot + MyBatis + MySQL 中间件技术 : Druid + Redis + RabbitMQ + Guava 秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、降级等措施来最大化减少对数据库的访问,从而保护系统。 充分利用缓存:
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot + MySQL + Redis + RabbitMQ + Guava开发的高并发商品限时秒杀系统 (109个子文件)
bootstrap.css 143KB
bootstrap.min.css 118KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
layer.css 14KB
layer.css 5KB
glyphicons-halflings-regular.eot 20KB
loading-0.gif 6KB
loading-2.gif 2KB
loading-1.gif 701B
goods_detail.htm 6KB
order_detail.htm 3KB
goods_detail.html 4KB
login.html 3KB
order_detail.html 3KB
goods_list.html 2KB
hello.html 1024B
seckill_fail.html 246B
GoodsController.java 5KB
SeckillController.java 5KB
RedisService.java 5KB
UserService.java 4KB
UserUtil.java 3KB
DemoController.java 3KB
UserArgumentResolver.java 3KB
CodeMsg.java 2KB
OrderInfo.java 2KB
OrderService.java 2KB
MQReceiver.java 2KB
OrderController.java 2KB
SeckillService.java 2KB
MQConfig.java 2KB
GoodsService.java 2KB
User.java 2KB
RedisConfig.java 1KB
GlobalExceptionHandler.java 1KB
Goods.java 1KB
MD5Util.java 1KB
GoodsMapper.java 1KB
OrderMapper.java 1KB
MQSender.java 1KB
LoginController.java 1KB
SeckillGoods.java 1KB
GoodsVo.java 1KB
RateLimiterDemo.java 1KB
WebConfig.java 992B
IsMobileValidator.java 952B
Result.java 936B
RedisPoolFactory.java 932B
GoodsDetailVo.java 892B
DBUtil.java 865B
LoginVo.java 858B
UserController.java 842B
IsMobile.java 755B
SeckillOrder.java 745B
BasePrefix.java 694B
ValidatorUtil.java 595B
UserMapper.java 560B
UserKey.java 522B
GlobalException.java 495B
SeckillMessage.java 494B
OrderDetailVo.java 488B
GoodsKey.java 383B
MainApplication.java 305B
KeyPrefix.java 296B
OrderKey.java 275B
SeckillKey.java 267B
UUIDUtil.java 266B
bg.jpg 3.62MB
bg2.jpg 80KB
jquery.min.js 82KB
bootstrap.js 68KB
bootstrap.min.js 36KB
layer.js 21KB
jquery.validate.min.js 21KB
additional-methods.min.js 17KB
md5.min.js 10KB
layer.js 3KB
common.js 1KB
messages_zh.min.js 1KB
npm.js 484B
bootstrap.min.css.map 529KB
bootstrap.css.map 380KB
bootstrap-theme.css.map 47KB
bootstrap-theme.min.css.map 25KB
README1.md 7KB
iphone8.png 340KB
mi6.png 74KB
meta10.png 41KB
userinfo_test_2.png 30KB
userinfo_test_1.png 29KB
userinfo_test_5.png 28KB
goodsList_test_2.png 27KB
goodsList_test_3.png 26KB
optimised_goodslist.png 26KB
optimised_userinfo.png 25KB
userinfo_test_4.png 25KB
goodslist_test_1.png 24KB
iphonex.png 23KB
icon.png 11KB
共 109 条
- 1
- 2
资源评论
- qq_580523382023-10-31资源不错,对我启发很大,获得了新的灵感,受益匪浅。
白话机器学习
- 粉丝: 8214
- 资源: 7687
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab开发的全面详解LTE:MATLAB建模、仿真与实现-simulink.rar
- 自动驾驶定位系列教程二:系统架构.pdf
- 整站程序8优技巧网-8ujq.rar
- 世界各个国家或地区国际域名缩写
- 基于matlab开发的根据rvm回归模型自己编的matlab程序.rar
- 基于matlab开发的该程序为国内一所大学编写的LTE链路层仿真程序,根据LTE标准协议编写的,很容易看懂.rar
- 高效C++学生成绩管理系统:教育技术+C++17编程+数据管理+教务自动化
- 搜索链接要广告分类系统 v2.0-yad20.rar
- 基于matlab开发的Tipping的相关向量机RVM的回归MATLAB程序,有英文注释,可以运行.rar
- 一个点击正反转程序实例,可实现案件电机正反转
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功