SpringMVC通过Redis实现缓存主页

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC通过Redis实现缓存主页相关的知识,希望对你有一定的参考价值。

这里说的缓存只是为了提供一些动态的界面没办法作静态化的界面来减少数据库的访问压力,如果能够做静态化的话的还是采用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代码  收藏代码<bean class="com.zhang.example.servlet.CacheFilter" id="cacheFilter"></bean>  web.xml中的声明 
Java代码  收藏代码<filter>  
        <filter-name>Cache Filter</filter-name>  
        <filter-class>com.zhang.example.servlet.CacheFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>Cache Filter</filter-name>  
        <servlet-name>/</servlet-name>  
    </filter-mapping>  这时,我们就可以在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; 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分钟。这样下次请求时就可以直接从缓存中读取

技术分享
获取【下载地址】   QQ: 313596790   【免费支持更新】
支持三大数据库 mysql  oracle  sqlsever   更专业、更强悍、适合不同用户群体
新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统
A 代码生成器(开发利器);   
   增删改查的处理类,service层,mybatis的xml,SQL( mysql   和oracle)脚本,   jsp页面 都生成
   就不用写搬砖的代码了,生成的放到项目里,可以直接运行
B 阿里巴巴数据库连接池druid;
  数据库连接池  阿里巴巴的 druid。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势
C 安全权限框架shiro ;
  Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权,更安全,更可靠
D ehcache 分布式缓存;
  是一个纯Java的进程内缓存框架,具有快速、精干等特点,广泛使用的开源Java分布式缓存。
E 微信接口开发(后续会加入Activiti5 工作流 )赠送一个jbpm工作流大型ERP系统(含OA、财务、分销)参考学习
F WebSocket 通信技术 (即时聊天、及时站内信并声音提醒、实时在线管理)

以上是关于SpringMVC通过Redis实现缓存主页的主要内容,如果未能解决你的问题,请参考以下文章

mybatis-redis二级缓存

Springboot 实现WebMvcConfigurer接口来拓展SpringMvc的功能

Redis 缓存 + Spring 的集成示例

springmvc+mybatis+redis(转)

使用Spring Cache实现广告缓存并基于RabbitMQ实现双写一致

使用Spring Cache实现广告缓存并基于RabbitMQ实现双写一致