设为首页 收藏本站
查看: 746|回复: 0

[经验分享] SpringMVC通过Redis实现缓存主页

[复制链接]

尚未签到

发表于 2018-11-5 13:02:47 | 显示全部楼层 |阅读模式
  这里说的缓存只是为了提供一些动态的界面没办法作静态化的界面来减少数据库的访问压力,如果能够做静态化的话的还是采用nginx来做界面的静态化,这样可以承受高并发的访问能力。
  好了,废话少说直接看实现代码吧下载地址
  实现机制主要是通过过滤器拦截方案,有两个地方要注意的
  1,Servlet过虑器中使用Spring容器
  2,截获JSP渲染结果保存redis中
  首先看第一个Servlet过虑器中使用Spring容器
  定义一个filter, 实现ApplicationContextAware接口
  Java代码  

  •   public class CacheFilter implements Filter, ApplicationContextAware {
  •   private static ApplicationContext ctx; // 必须声明为static
  •   @Override
  •   public void init(FilterConfig config) throws ServletException {
  •   }

  •   @Override
  •   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  •   filterChain.doFilter(servletRequest, servletResponse);
  •   }
  •   @Override
  •   public void destroy() {

  •   }
  •   @Override
  •   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  •   CacheFilter.ctx = applicationContext; // 保存spring容器到static变量中
  •   }
  配置spring的bean
  Java代码  

  •   
  web.xml中的声明
  Java代码  

  •   
  •   Cache Filter
  •   com.zhang.example.servlet.CacheFilter
  •   
  •   
  •   Cache Filter
  •   /
  •   
  这时,我们就可以在doFilter()方法中直接通过ApplicationContext检索需要的bean了
  Java代码  

  •   StringRedisTemplate redis = (StringRedisTemplate)ctx.getBean("redisTemplate");
  二,截获JSP渲染结果
  Java代码  

  •   public class ResponseWrapper extends HttpServletResponseWrapper {
  •   private PrintWriter cachedWriter;
  •   private CharArrayWriter bufferedWriter;

  •   public ResponseWrapper(HttpServletResponse response) {
  •   super(response);
  •   // 这个是我们保存返回结果的地方
  •   bufferedWriter = new CharArrayWriter();
  •   // 这个是包装PrintWriter的,让所有结果通过这个PrintWriter写入到bufferedWriter中
  •   cachedWriter = new PrintWriter(bufferedWriter);
  •   }

  •   @Override
  •   public PrintWriter getWriter() {
  •   return cachedWriter;
  •   }

  •   /**
  •   * 获取原始的HTML页面内容。
  •   *
  •   * @return
  •   */
  •   public String getResult() {
  •   return bufferedWriter.toString();
  •   }
  •   }
  Java代码  

  •   public class CacheFilter implements Filter, ApplicationContextAware {
  •   private static final Logger log = LoggerFactory.getLogger(CacheFilter.class);

  •   private static ApplicationContext ctx;
  •   @Override
  •   public void init(FilterConfig config) throws ServletException {
  •   }

  •   @Override
  •   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  •   HttpServletResponse resp = (HttpServletResponse) servletResponse;
  •   HttpServletRequest req = (HttpServletRequest) servletRequest;
  •   // 如果不是访问主页,放行
  •   if (false == req.getRequestURI().equals("/")) {
  •   filterChain.doFilter(servletRequest, resp);
  •   return;
  •   }
  •   // 访问的是主页
  •   // 从缓存中得到主页html
  •   String html = getHtmlFromCache();
  •   if (null == html) {
  •   // 缓存中没有 截取生成的html并放入缓存
  •   log.info("缓存不存在,生成缓存");
  •   ResponseWrapper wrapper = new ResponseWrapper(resp);
  •   filterChain.doFilter(servletRequest, wrapper);
  •   // 放入缓存
  •   html = wrapper.getResult();
  •   putIntoCache(html);
  •   }
  •   // 返回响应
  •   resp.setContentType("text/html; ");
  •   resp.getWriter().print(html);
  •   }
  •   @Override
  •   public void destroy() {
  •   }

  •   @Override
  •   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  •   this.ctx = applicationContext;
  •   }

  •   private String getHtmlFromCache() {
  •   StringRedisTemplate redis = (StringRedisTemplate)ctx.getBean("redisTemplate");
  •   return redis.opsForValue().get("home");
  •   }

  •   private void putIntoCache(String html) {
  •   StringRedisTemplate redis = (StringRedisTemplate)ctx.getBean("redisTemplate");
  •   redis.opsForValue().set("home", html, TimeUnit.MINUTES.toSeconds(10)); // 10分钟
  •   }
  •   }
  按照这个逻辑,当客户的GET请求为/时,CacheFilter会首先向Redis发起请求获取主页的html代码,如果成功,则直接返回给客户端,失败,则通过刚刚写好的ResponseWrapper截获主页JSP的渲染结果,放入Redis,并设置过期时间为10分钟。这样下次请求时就可以直接从缓存中读取【下载地址】


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631155-1-1.html 上篇帖子: redis监控工具-redis sentinel 下篇帖子: Redis (一) CentOS 十分钟搭建Redis 2.8.9-Mr
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表