- 浏览: 230612 次
- 性别:
- 来自: 上海
最新评论
这里说的缓存只是为了提供一些动态的界面没办法作静态化的界面来减少数据库的访问压力,如果能够做静态化的话的还是采用nginx来做界面的静态化,这样可以承受高并发的访问能力。
好了,废话少说直接看实现代码吧,
实现机制主要是通过过滤器拦截方案,有两个地方要注意的
1,Servlet过虑器中使用Spring容器
2,截获JSP渲染结果保存redis中
首先看第一个Servlet过虑器中使用Spring容器
定义一个filter, 实现ApplicationContextAware接口
配置spring的bean
web.xml中的声明
这时,我们就可以在doFilter()方法中直接通过ApplicationContext检索需要的bean了
二,截获JSP渲染结果
好了,废话少说直接看实现代码吧,
实现机制主要是通过过滤器拦截方案,有两个地方要注意的
1,Servlet过虑器中使用Spring容器
2,截获JSP渲染结果保存redis中
首先看第一个Servlet过虑器中使用Spring容器
定义一个filter, 实现ApplicationContextAware接口
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
<bean class="com.zhang.example.servlet.CacheFilter" id="cacheFilter"></bean>
web.xml中的声明
<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了
StringRedisTemplate redis = (StringRedisTemplate)ctx.getBean("redisTemplate");
二,截获JSP渲染结果
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分钟。这样下次请求时就可以直接从缓存中读取
发表评论
-
三分钟学会@Autowired@Qualifier@Primary注解
2018-05-20 09:39 0今天主要简单的跟大家介绍一下spring自动装配相关的@A ... -
两分钟学会自动注入@Resource和@Inject注解
2018-05-20 09:25 9297上文系统的介绍了spring自动装配@Autowired注解 ... -
一分钟学会spring注解之@Lazy注解
2018-05-20 09:24 6346今天主要从以下几方面来介绍一下@Lazy注解 @La ... -
一分钟学会spring注解之@Autowired注解(二)
2018-05-20 09:35 6035上一遍文章中有简单的介绍@Autowired注解的使用,没有 ... -
全网最全技术电子书免费发放
2018-05-20 09:19 1323之前整理过一些互联网技术相关的视频资料,大家的反馈都不错,然 ... -
深入理解spring之Aware接口的相关实现
2018-05-20 09:28 1536前面几篇文章简单的介绍了spring中bean注解以及怎么在 ... -
200G免费偷懒必看资料全集(二)
2018-05-05 16:10 1157在上文小编整理过一大波资料分享出来之后,大家的回应说都不错 ... -
250G偷懒必看资料全集
2018-05-05 16:04 1258要想成为一个专业的'偷懒'程序员,没有点偷懒必看资料怎么能 ... -
200G免费偷懒必看资料全集(二)
2018-05-04 22:41 0在上文小编整理过一大波资料分享出来之后,大家的回应说都不错( ... -
深入理解java的反射机制
2018-04-29 19:03 588今天将从以下4方面来系统的学习一下java的反射机制: ... -
深入理解java注解的实现原理
2018-04-29 19:13 744今天将从以下4个方面来系统的学习一下java注解 ... -
深入理解java动态代理的实现机制
2018-04-29 19:10 572今天将从以下5方面来系统的学习一下java动态代理的实现机 ... -
spring boot 过滤器去除请求参数前后空格
2017-09-26 21:54 11416需求:去除用户表单参数中由于用户不小心输 ... -
spring+quartz实现定时任务支持集群
2016-08-08 16:49 756最近项目要做集群,然后找了下资料发现quartz本身就支持集 ... -
spring+aop+自定义注解实现操作日志记录
2016-08-07 11:49 75781,spring配置文件 <bean class= ... -
Nginx1.9+LuaJIT+Kafka的点播监控系统实战
2016-05-21 11:03 1111安装前的准备 Nginx1.9.9LuaJIT-2.0. ... -
post,get请求nginx记录日志kafka自动扫描程序
2016-04-14 16:03 1259kafka的介绍以及使用安装请查看博文ht ... -
springmvc整合dubbo分布式系统的搭建小例子
2016-01-30 12:56 5434四个步骤 1 搭建zookeepe ... -
redis Jedis序列化自定义存储list对象和map数据
2016-01-28 20:07 256031,redis缓存配置类 public class Redis ... -
java数字签名三种方式
2015-07-08 08:48 7147以下3钟数字签名都是基于jdk7的 1,RSA Strin ...
相关推荐
在本项目中,"SpringMvc集成Redis项目完整示例" 提供了一个全面的教程,教你如何将Spring MVC框架与Redis缓存系统相结合。这个示例包括了Web应用程序的实例以及独立的Java测试案例,无需启动Web服务器即可进行测试。...
本项目以“maven+springmvc+redis+mybatis整合”为主题,旨在提供一个基于这些技术的集成框架,特别强调了利用Redis作为缓存来提升应用性能。下面将详细阐述这个框架中的各个组成部分以及它们之间的协作。 首先,...
后续相同请求可以直接从Redis缓存中获取数据,提升响应速度。 总的来说,这个项目展示了如何利用SpringMVC、Redis和MyBatis构建一个高效的Web应用。通过合理使用缓存,可以显著减少数据库压力,提高系统的响应速度...
这样,后续相同请求就可以直接从Redis缓存中读取,提高了效率。 为了实现这个功能,可以使用Spring的AOP(面向切面编程)来拦截数据库查询方法,通过`@Cacheable`注解指定缓存策略。例如,你可以定义一个全局的缓存...
SpringMVC是Java Web开发中的主流框架,通过与Redis集成,可以实现高效的缓存策略。本文将深入探讨如何在SpringMVC 4.3框架下集成Redis 4.5集群,包括两种不同的实现方式。 **一、自定义工具类集成** 1. **配置...
"Shiro+SpringMVC+Redis+MySQL实现单点登录"是一个典型的系统安全架构,它整合了多个技术组件来构建一个高效、可靠的单点登录(Single Sign-On, SSO)解决方案。以下是关于这个主题的详细知识点: 1. **Apache ...
通过这样的整合,SpringMVC应用能够利用Redis的高速缓存能力,提高数据处理速度,尤其在处理高并发请求时,可以显著降低数据库的压力,提升整体系统性能。同时,这也是一种常见的微服务架构中的缓存策略,可以作为...
通过这种方式,你可以充分利用Redis的高速缓存能力,提高Spring MVC应用程序的响应速度和整体性能。在实际项目中,还需要注意线程安全、序列化策略、过期策略等细节问题,以确保系统的稳定性和效率。
SpringMvc、Redis、ActiveMQ是三个在IT领域中广泛应用的技术组件,它们分别在Web开发、数据缓存和消息传递方面发挥着重要作用。本教程将详细解释如何利用这些技术实现一个功能完备的消息发布订阅系统。 首先,...
例如,@Cacheable(value = "myCache", key = "#id")会将方法的返回值以"id"为键存储到名为"myCache"的Redis缓存中。当同一方法被调用时,如果缓存中存在该键,则会直接返回缓存值,无需再次执行方法。 在项目运行时...
将Redis与SpringMVC结合,可以实现高效的缓存策略,提升Web应用的性能。本文将深入探讨如何配置Redis的哨兵模式,并将其与SpringMVC集成。 首先,我们来看哨兵(Sentinel)模式。哨兵模式是Redis提供的高可用性解决...
4. **使用Redis缓存**:在Spring MVC的Controller层,我们可以使用注解如`@Cacheable`、`@CacheEvict`等来实现方法级别的缓存控制。这些注解可以帮助我们在执行特定方法前检查缓存,如果存在,则直接返回缓存结果,...
在这个项目中,"springmvc+spring+mybatis+redis"的组合被用于构建一个高效的秒杀系统。下面将详细介绍这四个技术在实现秒杀中的作用和它们之间的协作。 1. SpringMVC: SpringMVC是Spring框架的一个模块,主要用于...
7. **消息订阅/发布**:Spring Data Redis也支持Redis的发布/订阅功能,通过`MessagingTemplate`可以实现消息的发布和订阅,这在构建分布式系统时非常有用。 综上所述,Spring MVC与Redis的集成涉及了多个层面,...
5. **事务支持**: 虽然Redis不支持复杂的事务,但可以通过编程方式实现简单的事务操作。 在实际项目中,Spring MVC、MyBatis和Redis的集成使用能构建出高效、可扩展的后端服务。合理地配置和优化这三个组件,可以...
Redis则是一款高性能的内存数据结构存储系统,常用于实现缓存、消息队列等功能。本项目旨在整合这两大组件,以提升SSM应用的性能和响应速度。 在SSM框架中整合Redis实现缓存,主要涉及以下几个步骤和知识点: 1. *...
在本文中,我们将深入探讨如何使用Spring框架与Redis集成,以实现高效的缓存管理,并通过注解的方式简化这一过程。Redis是一种高性能的键值数据存储系统,常被用于缓存、消息队列等多种场景,而Spring框架则为Java...
Redis,一个高性能的键值存储系统,常被用于缓存、消息队列等场景。将Spring MVC与Redis结合,可以有效提升应用的响应速度和数据处理能力。本文将详细介绍如何在Spring MVC中整合Redis,并利用连接池来优化性能。 ...
### MyBatis与Redis缓存配置详解 #### 一、MyBatis缓存机制概述 在MyBatis中,缓存是一项重要的性能优化措施。它能够显著减少数据库的访问次数,提高应用程序的响应速度。MyBatis提供了两种级别的缓存支持:一级...
本文将详细讲解如何使用Maven来简单搭建一个集成了Spring MVC和Redis缓存的项目。 首先,让我们从Maven开始。Maven是一个项目管理工具,它帮助开发者管理依赖、构建项目以及执行自动化测试。在创建新项目时,我们...