《如何优化项目一》:页面缓存优化

前言叙述

在日常编写练手项目的时候,对于项目的优化并没有关注太多,关注点大部分集中在后端的代码逻辑如何去实现,而对于前端的渲染却没有过多的重视,只觉得可以显示即可,并不会对此有什么深入的要求。但是,如果我们要做的是一个供给大众使用的平台呢?如果依旧只注重于后端代码逻辑的实现,而不思考前端的渲染效率,那么最终会造成什么样的后果呢?我们可以从两方面去分析:

  • 用户方面 :

用户群体关注的是页面加载的速度,对用户所进行的操作的响应是否及时,简单来说就是是否能给用户带来更好的用户体验。

假设两种情形:我去找海绵宝宝和小蜗 抓水母

第一种:海绵宝宝一分钟内开门迎接我

第二种:海绵宝宝和小蜗睡着了,没有开门迎接我

对于上述两种情形,我更喜欢第一种立刻开门迎接我的海绵宝宝。所以映射到现实生活中,对于一个平台用户更喜欢加载速度快,对做出的操作响应及时的平台。

  • 服务器方面 :

如果减少页面请求数、或者减小请求所占带宽,服务器能够节省可观的资源,这不直接省下一笔额外的开销

步入正题

那么我们要如何对我们的项目做一些优化处理呢?首先我们先了解一个什么是页面缓存优化,其实就是字面意思,就是把我们需要thymeleaf 模板渲染的页面缓存到 Redis中。

为什么说做缓存可以优化我们的系统呢?

  • 缓存可以降低逻辑复杂度
  • 缓存可以减少访问数据库次数

通过以上两点可以大幅度减少服务器的响应时间。

不使用缓存优化时

《如何优化项目一》:页面缓存优化_第1张图片

不对页面进行缓存优化,当我们有n次请求时,这时服务器就会对数据库进行n次请求,严重增加了数据库的压力,当某一时刻请求次数突然骤增,那么数据库很可能就会濒临崩溃

使用缓存做优化时

《如何优化项目一》:页面缓存优化_第2张图片

当我们使用对页面进行缓存优化后,发出的请求只需要在缓存中获取即可!这样就可以大大减少对数据库的访问次数,从而大幅度减少服务器的响应时间。

从程序的执行流程做进一步的理解

《如何优化项目一》:页面缓存优化_第3张图片

上图的流程粗解:用户发出请求,先到缓存中去获取相应数据,缓存中如果存在,则直接从缓存中获取从而进入目标页面,如果没有则按照流程先在Controller中进行相应的方法调用,其次将得到的页面进行缓存,然后进行thymeleaf跳转相应页面。

代码实现:

引入依赖


<dependency>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

<dependency>
  <groupId>org.apache.commonsgroupId>
  <artifactId>commons-pool2artifactId>
dependency>

<dependency>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starter-thymeleafartifactId>
dependency>

相关配置

## Redis配置
  redis:
    # 服务器地址
    host: localhost
    # 端口
    port: 6379
    # 数据库
    database: 0
    # 超时时间
    connect-timeout: 10000ms
    lettuce:
      pool:
        # 最大连接数
        max-active: 8
        # 最大连接阻塞等待时间 默认 -1
        max-wait: 10000ms
        # 最大空闲时间 默认8
        max-idle: 200
        # 最小空闲连接 默认8
        min-idle: 5
  # thymeleaf 配置
  thymeleaf:
    # 关闭缓存
    cache: false
    prefix: classpath:/templates/

代码逻辑实现

//做手动渲染
@Autowired
private ThymeleafViewResolver thymeleafViewResolver;
@Autowired
private GoodsService goodsService;
@Autowired
private RedisTemplate redisTemplate;
/**
  * 跳转商品列表
  * @param model
  * @return
  */
@RequestMapping(value = "/toList",produces = "text/html;charset=utf-8")
@ResponseBody
public String toList(Model model,HttpServletRequest request, HttpServletResponse response){

  //Redis中获取页面,如果不为空,则直接返回页面
  ValueOperations valueOperations = redisTemplate.opsForValue();
  String html = (String) valueOperations.get("goodsList");
  if (!StringUtils.isEmpty(html)){
    return html;
  }
  User user = (User) request.getSession().getAttribute("user");
  model.addAttribute("user",user);
  model.addAttribute("goodsList",goodsService.findGoodsVo());
  //return "goodsList";
  //如果为空,手动渲染,存入Redis中并返回
  WebContext webContext = new WebContext(request,response,request.getServletContext(),request.getLocale(),model.asMap());
  html = thymeleafViewResolver.getTemplateEngine().process("goodsList", webContext);
  if (StringUtils.isEmpty(html)){
    //给缓存设置过期时间
    valueOperations.set("goodsList",html,60, TimeUnit.SECONDS);
  }
  return html;
}

启动项目测试

《如何优化项目一》:页面缓存优化_第4张图片

你可能感兴趣的