spring cache+redis缓存在实际项目中的简单运用

redis 依赖的jar包:
commons-pool2-2.5.0.jar
jedis-2.9.0.jar
spring-data-redis-1.6.2.RELEASE.jar
我是配合spring4.2实现的缓存操作:我这里实现不在是用redis或则spring cache + redis封装好的缓存  我们这里自己实现需要的缓存数据进行统一缓存 在开发中为了避免脏数据的获取与统一管理缓存数据 我们都是在指定的时间把指定需要进行缓存的数据进行缓存 比如网上的商品数据就是这样实现的 比如每天凌晨把白天需要展示的缓存数据 进行缓存加载在redis里面
我们这里通过配置RedisTemplate 实例来实现



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" 
       xmlns:tx="http://www.springframework.org/schema/tx" 
       xmlns:task="http://www.springframework.org/schema/task" 
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
           http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd
           http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.2.xsd">


<!-- 配置自动识别注解 -->
    <context:component-scan base-package="com.dome" >
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- <task:annotation-driven/> -->
    <task:annotation-driven executor="asyncExecutor" scheduler="scheduler"/>
  <task:executor id="asyncExecutor" pool-size="100-1000" queue-capacity="10000" rejection-policy="CALLER_RUNS"/>
  <task:scheduler id="scheduler" pool-size="100" />


    <!--加载数据库配置文件-->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="locations">
           <list>
              <!-- 加载数据库连接设置 -->
  <value>classpath:config/database.properties</value>
  <!-- <value>classpath:config/database.properties</value> -->
  <!-- 加载redis连接设置 -->
  <value>classpath:config/redis.properties</value>
          </list>
      </property>
    </bean>
    
<!-- 数据中心连接  就是数据库连接设置 我是封装在一个文件里的  暂不提供-->   
<import resource="datasource-sqlserver.xml" /> 
<!-- redis 缓存设置 redis 连接设置 封装在一个文件里 -->
<import resource="redis_two.xml" />
<!-- 解决使用@ResponseBody 的中文乱码。 --> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
        <property name="messageConverters">  
            <list>  
                <!-- JSON解析对象 -->
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
                <property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
                </bean>  
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
                    <property name="supportedMediaTypes">  
                        <list>  
                            <value>text/plain;charset=UTF-8</value>  
                        </list>  
                    </property>  
                </bean>  
            </list>  
        </property>
         <!-- 日期格式转换 -->
    <property name="webBindingInitializer">    
        <bean class="com.dome.filter.DateConverterFilter" />    
    </property>    
    </bean>
 
  <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">  
  <!-- 验证码  kaptcha-->
        <property name="config">  
            <bean class="com.google.code.kaptcha.util.Config">  
                <constructor-arg>  
                    <props>  
                        <prop key="kaptcha.border">yes</prop>  
                        <prop key="kaptcha.border.color">105,179,90</prop>  
                        <prop key="kaptcha.textproducer.font.color">blue</prop>  
                        <prop key="kaptcha.image.width">125</prop>  
                        <prop key="kaptcha.image.height">45</prop>  
                        <prop key="kaptcha.textproducer.font.size">45</prop>  
                        <prop key="kaptcha.session.key">kaptchaRemote</prop>  
                        <prop key="kaptcha.textproducer.char.length">4</prop>  
                        <prop key="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop>  
                    </props>  
                </constructor-arg>  
            </bean>  
        </property>  
    </bean>  
</beans>


redis的配置 其他无相关数据源省略 redis_two.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" 
       xmlns:tx="http://www.springframework.org/schema/tx" 
       xmlns:task="http://www.springframework.org/schema/task" 
       xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd  
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
           http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd
           http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.2.xsd">


    <!-- * 优势:可以配置使用多种不同缓存,比如ehcache+redis
         * 劣势:发现cacheName和key是用一个单独的缓存项实现的,推测其查询一次需要读取两次缓存,效率略低 
                                使用Spring内置CacheManager,内部使用RedisCache对象-->
         
<!-- jedis 配置  连接池配置-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxTotal}" />  
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
  
  <!-- 获取redis连接 设置-->
  <!-- redis服务器中心  连接redis基本信息-->
<bean id="connectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="poolConfig" ref="poolConfig" />
<property name="port" value="${redis.port}" />
<property name="hostName" value="${redis.host}" />
<property name="password" value="${redis.password}" />
<property name="timeout" value="${redis.timeout}"></property>
</bean>
 
  <!-- 获取redis连接 设置-->
<!-- redis template,被后面的RedisCacheManager或RedisCache引用 --> 
<!-- redis template,被后面的RedisCacheManager或RedisCache引用 --> 
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
  <!--开启事务  -->  
          <property name="enableTransactionSupport" value="true"/>
          <!--value,key值 的序列化  Redis缓存对象乱码处理      都指定为string-->
  <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
          </property>
         <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
         </property>
</bean>
 


</beans>




伪代码验证 按自己需求添加代码 (谨做参考):
控制层:
package com.dome.controller.user;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
@RequestMapping(value = "/user")
public class UserController2 {
// 自己的service层
// @Resource
// private xxxxxService xxxxxService;


@SuppressWarnings("rawtypes")
@Resource
private RedisTemplate redisTemplate;


@RequestMapping(value="/test")
public Object getOnes(HttpServletRequest request) {
try {
@SuppressWarnings("rawtypes")
ValueOperations value = redisTemplate.opsForValue();
//从redis缓存数据里 加载数据 key=list 这里的key与value的添加 直接去redis客户端添加 这里验证一下 看是否能运行
//可以正常逻辑运行 则最好定一个定时任务 往里面添加需要缓存的数据 则就不要去客户端手动添加啦
String list = (String) value.get("list");
//判断是否有缓存数据
if(StringUtils.isNotBlank(list)) {
//自己做数据相关转换处理 缓存的数据推荐存储为json格式
System.out.println("list");
//设置key的失效时间 不设置则永久保存
value.set("key键", "key值", 1, TimeUnit.MINUTES);//1为时间表数 TimeUnit.MINUTES时间类型 
}else {
//没有缓存数据 做数据库查询处理
// xxxxxService.相关查询方法;
}
}catch (Exception e) {
//加载缓存数据出错 也做数据库加载操作
// xxxxxService.相关查询方法;
}

return null;
}
}
// 定时任务伪代码 直接用在你定时任务里的方法里即可
// 获取redis对象
//RedisTemplate rt=CommonUtil.getCurrentApplicationContext().getBean(redisTemplate.class);
//ValueOperations value = rt.opsForValue();
// 你需要缓存数据的 service 层实例
//xxxx=CommonUtil.getCurrentApplicationContext().getBean(xxxxService.class);
//xxxx.方法获取数据
//value.set("key值","缓存数据 service层获取的数据");




本人觉得 在任务类里定时添加需要缓存的数据 避免了查询脏数据 也方便管理统一的缓存数据 也便于维护





阅读更多
个人分类: redis
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭