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层获取的数据");
本人觉得 在任务类里定时添加需要缓存的数据 避免了查询脏数据 也方便管理统一的缓存数据 也便于维护
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层获取的数据");
本人觉得 在任务类里定时添加需要缓存的数据 避免了查询脏数据 也方便管理统一的缓存数据 也便于维护