商品详情页页面静态化

tech2024-07-23  39

为什么要使用页面静态化

因为商品详情页的数据太多,需要后台大量查询数据,渲染到HTML页面,造成数据库压力。

怎么解决?

Redis,适合数据较小的,如果每个页面10kb, 100万个商品,就是10GB空间,占用内存大。

什么是页面静态化?

把动态生成的HTML变为静态的内容保存,以后用户请求到来,直接访问静态页面,不用经过服务的渲染。静态的HTML部署在nginx中,大大提高并发能力,减小tomcat压力。

如何实现静态化?

通过模板引擎生成,保存到nginx服务器来部署。Thymeleaf把渲染结果写入Response,也可以写到本地文件,从而实现静态化。

具体如何实现?

请求商品页面,除了返回页面视图外,还应异步创建一个静态页面。修改nginx,让它对商品请求进行监听,指向本地静态页面,如果本地没找到,才进行反向代理: @Service public class GoodsHtmlService { @Autowired private GoodsService goodsService; @Autowired private TemplateEngine templateEngine; private static final Logger LOGGER = LoggerFactory.getLogger(GoodsHtmlService.class); /** * 创建html页面 * * @param spuId * @throws Exception */ public void createHtml(Long spuId) { PrintWriter writer = null; try { // 获取页面数据 Map<String, Object> spuMap = this.goodsService.loadModel(spuId); // 创建thymeleaf上下文对象 Context context = new Context(); // 把数据放入上下文对象 context.setVariables(spuMap); // 创建输出流 File file = new File("C:\\project\\nginx-1.14.0\\html\\item\\" + spuId + ".html"); writer = new PrintWriter(file); // 执行页面静态化方法 templateEngine.process("item", context, writer); } catch (Exception e) { LOGGER.error("页面静态化出错:{},"+ e, spuId); } finally { if (writer != null) { writer.close(); } } } /** * 新建线程处理页面静态化 * @param spuId */ public void asyncExcute(Long spuId) { ThreadUtils.execute(()->createHtml(spuId)); /*ThreadUtils.execute(new Runnable() { @Override public void run() { createHtml(spuId); } });*/ } }

线程工具类:

public class ThreadUtils { private static final ExecutorService es = Executors.newFixedThreadPool(10); public static void execute(Runnable runnable) { es.submit(runnable); } }
最新回复(0)