编程知识 购物 网址 新闻 笑话 | 软件 日历 阅读 图书馆 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> 架构设计 -> SpringMVC通过Redis实现缓存主页 -> 正文阅读

[架构设计]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分钟。这样下次请求时就可以直接从缓存中读取

  架构设计 最新文章
spring boot实现ssm(2)功能
java 企业站源码 兼容手机平板PC 自适应响应
Serverless无服务应用架构纵横谈
理论篇:关注点分离(Separation of concern
Struts 2 入门
spring boot实现ssm(1)功能
SpringMVC通过Redis实现缓存主页
网络应用的编程模型
应用服务器和Web服务器
java 企业网站源码 后台 springmvc SSM 前台
上一篇文章      下一篇文章      查看所有文章
加:2016-01-29 12:52:45  更:2017-05-16 02:43:07 
 
360图书馆 软件开发资料 购物精选 新闻资讯 Chinese Culture 三丰软件 开发 中国文化 阅读网 日历 万年历 2019年10日历
2019-10-18 10:03:25
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识