SpringMVC通过Redis实现缓存主页

SSM之Spring注解式缓存Redis以及redies中的击穿,雪崩,穿的三种现象 一种解决方案是使用布隆过滤器(Bloom Filter),在查询缓存之前先进行布隆过滤器的判断,如果键不在布隆过滤器中,则直接返回缓存缺失的结果,而不去查询数据库。另一种方案是使用“空值缓存”,即将缓存中不存在的数据(如数据库中不存在的数据)也缓存起来,这样下次请求同样的数据时,可以直接从缓存中获取到空值。:一种解决方案是在缓存的失效时间上引入随机性,避免大量缓存同时失效。另一种方案是使用多级缓存架构,将缓存分为多个层级,当某一层缓存失效时,可以从其他层级的缓存中获取数据,避免全部请求直接访问数据库。 阅读详情

首先,缓存主页的目的并不一定是提高性能,而是减少数据库访问压力,有效推迟数据库I/O瓶颈的到来。实现主页缓存的方法有很多,但是鉴于项目中使用了Redis对数据库读写做了缓存,因此把顺便也就把主页也缓存了吧。

实现思路

编写一个过滤器,在过滤器中拦截对主页的访问请求。此时向Redis服务器查询主页html的缓存,如果有则直接返回给客户端,如果没有,则在过滤器中截获JSP的渲染结果,放到Redis缓存中,以供下次使用。我们设定缓存过期时间为10分钟。

实现

实现需要注意的地方有两点:

  1. 如何在Servlet过虑器中使用Spring容器
  2. 如何截获JSP渲染结果

对于问题一,可以见我的另一篇博客:在Servlet Filter中使用Spring容器
对于问题二,我们可以继承HttpServletResponseWrapper类来巧妙实现:

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();
    }
}

然后在过滤器中使用该类:

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; charset=utf-8");
        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分钟。这样下次请求时就可以直接从缓存中读取,而不需要经过 Controller -> Service -> Dao -> Database这么费事的流程了。

springmvc+redis+mysql(数据库连接简单实现)数据缓存 实现redis与springmvc配置,数据库连接简单实现,待完善实现连接池 立即下载

相关推荐

Spring集成Redis进行数据缓存

SpringMVC集成Redis进行缓存管理,SpringMVC基于接口编程的实例,从代码中学习Spring是怎么集成缓存。

spring-data-redis 使用过程中需要注意的地方

1.序列化问题 <!-- SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。 StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。 RedisTemplate默认采用的是JDK的序列化策略,保存的key和valu...

297

redis(哨兵模式配置) + springmvc

自己学习springmvc + redis的实例,感兴趣的可以下载看看!

SpringMVC+Spring+mybatis+redis项目从零开始--redis缓存策略和配置实现

三.SSM项目-redis缓存策略和配置实现 距离上两篇文章已过去蛮久了,为了响应各位网友的需求,最近把这个系列重新整理下。如有不足之处,请指正。 本章将实现redis缓存策略和Spring集成redis配置。 1. Redis简单介绍 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset --有序集合)和hash(哈希类型)。这些数据类型都支持pu

if(true){ I love it } 2万+

在mdk文件移植太多_XCubeClassB代码 的移植

前言ST在www.st.com官网上提供了针对IEC60730/IEC60335 ClassB认证的软件包。软件包分为三个,分别适用STM8,STM32(基于标准外设库)和STM32(基于HAL库):STM8-SafeCLASSB,STM32-CLASSB-SPL,X-CUBE-CLASSB。本文以X-CUBE-CLASSB为例介绍如何做代码的移植以及经常遇到的问题的解决办法。X-CUB...

weixin_28898707的博客 1832

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1190

spring mvc @cache+redis 整合

一.spring cache和cache+redis的区别 1. 缓存级别不同 Spring cache是代码级的缓存,他一般是使用一个ConcurrentMap。也就是说实际上还是是使用JVM的内存来缓存对象的,那么肯定会造成大量的内存消耗。但是使用方便。 Redis 作为一个缓存服务器,是内存级的缓存。它是使用单纯的内存来进行缓存。 2. sprirng cache+r...

小驴 3175

射频工程师笔记---射频通信基础

回顾一下移动通信技术的发展,其实是互联网和通信技术的融合过程。在这个过程中,很多应用都在不断加入其中。比如计算机跟通信的融合产生了互联网、互联网跟手机的融合带来了移动互联网。手机可以看杂志、看视频、听音乐,于是又出现了内容服务产业;再后来,电视音箱等设备也能联网,于是网络跟家电又产生了融合。所以应用的出现总是在融合其他产业。在1995年,比尔·盖茨在《未来之路》一书中首次提出:在未来...

多年硬件从业经历,热爱学习,记录生活! 2万+

基于ssm个人博客项目的学习

个人博客的作用:分享交流技术问题,记录学习过程学习笔记。 主要用到的技术及框架:spring springMVC Mybatis MySQL 使用redis缓存博客列表, 利用angularjs与后台通过传递json数据进行交互, shiro安全框架, 前端bootstrap页面渲染, 后端由maven搭建。 部署好了项目,项目可以运行了。 了解了在idea中debug的流程 还没有掌握高效设置断点的方法。 ...

weixin_44077628的博客 886

手把手教你用VSCode+MCUXpresso搭建i.MX RT1062开发环境(附RT-Thread Nano移植)

本文详细介绍了如何使用VSCode和MCUXpresso工具链搭建i.MX RT1062开发环境,包括工具链安装、工程配置、调试技巧以及RT-Thread Nano实时操作系统的移植方法。通过实战步骤和优化建议,帮助开发者快速掌握这款高性能Cortex-M7 MCU的开发流程,提升嵌入式开发效率。

weixin_27014595的博客 392

避坑指南:STM32F4的ADC采样FSR传感器,如何稳定读数并校准压力值?

本文详细解析了STM32F4的ADC采样FSR薄膜压力传感器时遇到的读数不稳定和非线性校准问题,提供了从硬件配置到软件滤波的完整解决方案。通过优化ADC设置、改进滤波算法和实施分段线性校准,帮助工程师实现高精度压力测量,特别适用于智能手套和医疗监测等应用场景。

weixin_28675839的博客 273

基于spring、springmvc、mybatis的新闻发布系统

项目概述 新闻发布系统是新闻媒体或者自媒体推送实时新闻,让其他用户或者游客阅读的网站。主要实现功能:前台开放式的展示新闻列表,允许所有用户、游客浏览,提供游客的登录注册功能,个人中心用户可以对自己文章、评论的管理,增加文章等功能;后台实现管理员管理所有文章、评论的删除、修改、编辑功能,实现对用户的强制下线,删除用户等功能。 需求分析 用户、游客可以任意的访问新闻主页各类型的文章信息,但是如果要进行评论游客需要进行登录/注册才能操作。 登录注册基础功能。 用户登录后,可以发表文章,在个人中心可以对自己文章,

毕业作品网站 1038

Codex 接入国产大模型完整指南:CC-Switch 与 Codex++ 的工程化选型

Codex 默认走 OpenAI Responses API,而 DeepSeek、GLM、Kimi 等国产模型只提供 OpenAI-compatible 的 Chat Completions——两套协议在消息结构、流式响应、reasoning 字段、tool call 上都不兼容,所以"改个 Base URL + 填国产 Key"这种朴素操作根本跑不通。本文从架构师视角出发,把 Codex 接入国产大模型这件事讲透:先剖析协议链路到底卡在哪,再对比 CC-Switch和 Codex++两套主流方案的差异

少说,多做 3853

ssm如何在mapper插入实时的时间_基于SSM框架实现一个完整的学生管理系统

这几天用SSM + Redis实现了一个较为完整的学生管理系统,感兴趣的同学可以下载来看看,项目注释写得很多,不失为一个学习的好项目。Github地址:https://github.com/blizzawang/stu_system由于项目中使用了Redis作为MyBatis的二级缓存,所以你还需要搭建一下Redis的环境,并修改RedisCache类中的主机ip:在这里插入图片描述若是...

weixin_39579468的博客 741

基于STM32L4XX、HAL库的CH182H1以太网收发器(PHY)驱动程序设计

define PHY_REG_PHYSCR 0x12 // PHY特殊控制寄存器。#define PHY_REG_PHYSTS 0x10 // PHY状态寄存器。#define PHY_REG_PHYIDR 0x11 // PHY标识寄存器。#define PHY_REG_ID1 0x02 // PHY标识符1。#define PHY_REG_ID2 0x03 // PHY标识符2。

zhusl6688的博客 404

YOLO26原创自研: 魔改Bottleneck,具备多尺度和特征通道融合的结构

魔改Bottleneck,具备多尺度和特征通道融合的结构,该模型在检测准确性方面都取得了良好的效果,尤其在缺陷检测方向。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 317

【苍穹外卖实战总结--五万字全面讲解,适合复盘】已燃尽TAT

苍穹外卖作为一套贴合企业真实开发场景的前后端分离外卖实战项目,涵盖用户端小程序与商家管理端,实现了点餐、订单交易、支付结算、数据统计及实时通知等完整业务流程,项目采用经典三层架构,Controller 层负责接收前端三种传参方式并统一返回结果,Service 层处理业务校验、事务控制与数据转换,Mapper 层通过 MyBatis 实现数据库操作,同时运用 Entity、DTO、VO、Result 完成四层数据封装,项目整合 SpringBoot、SpringMVC、MyBatis 等主流框架

任岁月风干理想再也找不回真的我 5190

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SSM 博客系统开发实战

课程简介 SSM 框架即 SpringMVC+Spring+Mybatis,相比 SSH(Struts2+Spring+Hibernate)来说较新,SpringMVC 可与 Spring 更好的整合,Mybatis 相比 Hibernate 使用更简单、轻便,大部分公司都在使用 SSM 这套框架,主要是轻量级、易使用,故本达人课特选择 SSM 框架作为课程主题,希望通过实战项目让大家对 SSM ...

GitChat 3万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

最新OpenFaaS实战之三:Java函数,springmvc面试题阿里

git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 || git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 || 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |// 如果从请求body中取不到userName,就给个默认值。

2301_82243979的博客 1009

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

tomcat+nginx+redis实现均衡负载、session共享(一)

在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新。但这可能会出现一些状况: 1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一)2.不知道的用户可能会想网站是不是被攻击了,降低了对网站的信任程度,从而导致失去部分潜在客户,这点尤其对金融互联网公司不利。 在查了一些资料后,决定采用Tomcat + Nginx + Redis来实...

泽宇的博客 327

基于Spring Boot的“课程设计”的设计与实现

这是一个集电影,音乐和书籍于一体的Java web应用 Java 1.8 框架:使用Spring Boot 集成Spring,Spring MVC,MyBatis(前期),Spring Data(后期) 数据库:MySQL 5.6 缓存:Redis 4.0 版本控制:Maven 3.5 页面解析框架:Thym...

weixin_33826268的博客 2615
上一篇: 在Servlet Filter中使用Spring容器
下一篇: 淘宝开源项目TbSchedule的部署和使用
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值