简述

正常情况下我们使用Springboot时在Controller中返回视图只需要 return "login" 就可以返回对应的Templates中的login.html页面,但其实每次访问都是我们的服务器将该页面的所有资源都发送给浏览器,对于用户经常访问并且页面一般不需要改动的页面我们可以将其放入我们的Redis中做缓存,这样可以提高我们服务器的效率提升用户的体验。

准备

我这里前端模板用的是thymeleaf

pom.xml

<dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency></dependencies>

application.yaml

server:port: 8080
#redis
spring:redis:#服务器地址host: localhost#端口port: 6379#数据库database: 0#超时时间connect-timeout: 10000mslettuce:pool:#最大连接数,默认是8max-active: 8#最大连接阻塞等待时间 默认是-1max-wait: 10000ms#最大空闲连接,默认是8max-idle: 200#最小空闲连接,默认是0min-idle: 5

config中RedisConfig类

package com.shao.cache.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<String, Object> redisTemplate = new RedisTemplate();redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}

前端资源login.html

<!DOCTYPE html>
<html lang="en"xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>登录</title><!-- jquery --><script type="text/javascript" th:src="@{/js/jquery.min.js}"></script><!-- bootstrap --><link rel="stylesheet" type="text/css"th:href="@{/bootstrap/css/bootstrap.min.css}"/><script type="text/javascript" th:src="@{/bootstrap/js/bootstrap.min.js}">
</script><!-- jquery-validator --><script type="text/javascript" th:src="@{/jquery-validation/jquery.validate.min.js}"></script><script type="text/javascript" th:src="@{/jquery-validation/localization/messages_zh.min.js}"></script><!-- layer --><script type="text/javascript" th:src="@{/layer/layer.js}"></script><!-- md5.js --><script type="text/javascript" th:src="@{/js/md5.min.js}"></script><!-- common.js --><script type="text/javascript" th:src="@{/js/common.js}"></script><h1 th:text="'你好:'+${username}"></h1><form name="loginForm" id="loginForm" method="post" style="width:50%; margin:0
auto"><h2 style="text-align:center; margin-bottom: 20px">用户登录</h2><div class="form-group"><div class="row"><label class="form-label col-md-4">请输入手机号码</label><div class="col-md-5"><input id="mobile" name="mobile" class="form-control"type="text" placeholder="手机号码" required="true"minlength="11" maxlength="11"/></div><div class="col-md-1"></div></div></div><div class="form-group"><div class="row"><label class="form-label col-md-4">请输入密码</label><div class="col-md-5"><input id="password" name="password" class="form-control"type="password" placeholder="密码"required="true" minlength="6" maxlength="16"/></div></div></div><div class="row"><div class="col-md-5"><button class="btn btn-primary btn-block" type="reset"onclick="reset()">重置</button></div><div class="col-md-5"><button class="btn btn-primary btn-block" type="submit"onclick="login()">登录</button></div></div></form></body><script></script>
</html>

Controller中的DemoController类

package com.shao.cache.controller;import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.context.WebContext;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;@Controller
@RequestMapping("/demo")
public class DemoController {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate ThymeleafViewResolver thymeleafViewResolver;@RequestMapping("test01")public String test01(Model model){model.addAttribute("username","赵六");return "login";}@ResponseBody@RequestMapping(value = "test02",produces = "text/html;charset=utf-8")public String test02(Model model, HttpServletRequest request, HttpServletResponse response){ValueOperations valueOperations = redisTemplate.opsForValue();String html = (String) valueOperations.get("login.html");if(StringUtils.isNotEmpty(html)){return html;}String username = "张三";model.addAttribute("username",username);//如果为空,手动渲染,存入redis并返回WebContext webContext = new WebContext(request,response, request.getServletContext(),request.getLocale(), model.asMap());html = thymeleafViewResolver.getTemplateEngine().process("login",webContext);valueOperations.set("login.html",html,1, TimeUnit.MINUTES);return html;}
}

说明:

test01接口是正常的访问返回视图

test02接口是将整个页面放入Redis中并且有效时间是1分钟

测试

测试test01接口

测试test02接口

Redis中确实存入的是整个页面

查询对应的key存活时间 此处是还有54秒失效

注意

Controller中要在对应的做页面缓存的接口中加入如下

    @ResponseBody@RequestMapping(value = "test02",produces = "text/html;charset=utf-8")

不然解析器无法识别返回的字符串

总结

在接口中缓存页面的几个主要步骤

1.判断是否有该缓存

2.有直接返回

3.没有就存入缓存

Ⅰ手动渲染

Ⅱ存入缓存并设置失效时间

4.返回该缓存

使用Redis实现整个页面的缓存相关推荐

  1. 利用Redis进行全页面缓存的简单Demo

    2019独角兽企业重金招聘Python工程师标准>>> 使用Redis进行全页面缓存,如何实现呢?本文使用简单的思路来实现这个功能. 一.环境介绍 使用的开源框架主要是springm ...

  2. spring+ehcache实现页面整体缓存和页面局部缓存

    第一步:首先配置ehcache.xml指定我们的SimplePageCachingFilter缓存  ,这里指定页面缓存的生命周期是60秒,还有timeToIdleSeconds的时间爱你是120秒, ...

  3. Redis进阶学习08--多级缓存

    Redis进阶学习08--多级缓存 什么是多级缓存 JVM进程缓存 环境准备 docker安装mysql docker安装nginx 反向代理 初识Caffeine 实现JVM进程缓存 需求 实现 L ...

  4. 带你100% 地了解 Redis 6.0 的客户端缓存

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 近日 Redis 6.0.0 GA 版本发布,这是 Redis 历 ...

  5. 常见网站各种类型页面的缓存时间及涉及的http头

    HTML缓存时间(单位秒): 根据内容的不同,缓存的时间也是不一样的,有些内容需要实时更新的,缓存时间为:43s,像图片这些内容缓存时间会长的多:134754s或者176716s,甚至更多 HTML页 ...

  6. redis系列之数据库与缓存数据一致性解决方案

    redis系列之数据库与缓存数据一致性解决方案 参考文章: (1)redis系列之数据库与缓存数据一致性解决方案 (2)https://www.cnblogs.com/jiawen010/p/1215 ...

  7. nuxt渲染html文件,Nuxt页面级缓存

    虽然 Vue 的服务器端渲染 (SSR) 相当快速,但是由于需要为每次请求为了避免交叉请求状态污染,都创建一个新的根Vue实例,创建组件实例和虚拟 DOM 节点的开销,无法与纯基于字符串拼接的模板的性 ...

  8. 十九、Redis 6.0 的客户端缓存

    一.为什么需要客户端缓存? 我们都知道,使用 Redis 进行数据的缓存的主要目的是减少对 MySQL 等数据库的访问,提供更快的访问速度,毕竟 <Redis in Action> 中提到 ...

  9. 一起谈.NET技术,页面片段缓存(二)

    在上一篇文章中,我介绍了我们用土法炼钢的方法,使用Velocity提供的自定义标签实现片段缓存.这样的方式虽然也解决了我们的问题,但还是引出了一些bug.而且还有点hack的味道(虽然我喜欢hack) ...

最新文章

  1. 为什么线程被唤醒后锁会被抢?
  2. 美国多个州对谷歌提起新的反垄断诉讼
  3. 关于事件相关电位P300应用于视频游戏的研究
  4. CentOS6.5下用yum安装 git .
  5. 将Visual Studio Code和Windows Subsystem for Linux一起使用
  6. matlab 中 x 轴的各种设置
  7. MySQL免安装版 图文教程【5.7版本,纯净版win7安装】
  8. 流媒体之RTMP——librtmp拉流测试
  9. c语言的运算符有那哪些,c语言逻辑运算符有哪些
  10. C语言 用指针 逆序存放数组
  11. 如何制作Android语音机器人
  12. 实现一个Android锁屏App的难点总结
  13. linux code lite编译c,CentOS 6.2编译安装CodeLite 5.3
  14. 台式计算机怎么加一个硬盘,台式电脑增加硬盘_台式电脑增加硬盘图解
  15. leetcode 栈739. 每日温度
  16. 人工智能的历史与未来,主要划分为了哪三个阶段
  17. 【Java】Prim最小生成树
  18. keras中的目标函数和优化函数
  19. aspose 换行写_Aspose.Words对于Word的操作
  20. 使用VGG-19模型训练自己的数据集

热门文章

  1. carla学习笔记(七)
  2. 利用excel批量操作MySql数据库
  3. h5前端开发培训,html5学习笔记
  4. 如何系统学习区块链技术-干货来袭
  5. unity3d 摄像机跟随角色时 画面抽搐问题
  6. C++ Reference: Standard C++ Library reference: C Library: cstdio: clearerr
  7. 我的Url重写,我的UrlRewriting
  8. 美通企业日报 | 微软和宝马推出开放式制造平台;爱彼迎Plus在中国发展势头强劲...
  9. java 信号量 闭锁_Java并发包之闭锁/栅栏/信号量
  10. 英伟达两个最新元宇宙布局