Redis
1、Spring整合Redis
2、RedisTemplate简化redis操作
3、Spring基于注解整合Redis实现内容缓存
Spring整合Redis
1:导入MAVEN项目所需依赖包
4.0.0
com
0514_RedisSpring
0.0.1-SNAPSHOT
<spring.version>4.1.3.RELEASE</spring.version>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
redis.clients jedis 2.9.0 junit junit 4.12 test
2.配置Spring整合Redis配置文件spring-redis.xml
xmlns:context=“http://www.springframework.org/schema/context” xmlns:p=“http://www.springframework.org/schema/p”
xmlns:mvc=“http://www.springframework.org/schema/mvc” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns:tx=“http://www.springframework.org/schema/tx” xmlns:util=“http://www.springframework.org/schema/util”
xmlns:aop=“http://www.springframework.org/schema/aop”
xsi:schemaLocation=“http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd”>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="1" />
<!-- 最大连接数 -->
<property name="maxTotal" value="5" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="true" />
<!-- 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1 -->
<property name="maxWaitMillis" value="30000" />
<!-- 在获取连接的时候检查有效性 -->
<property name="testOnBorrow" value="true" />
</bean>
<!-- redis单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="172.168.0.122" />
<constructor-arg name="port" value="6379" />
<constructor-arg name="timeout" value="30000" />
<!-- <constructor-arg name="password" value="" /> --> //设定密码确定有密码时打开
<!-- <constructor-arg name="database" value="1" /> -->//设定默认数据库,注意必须设置密码
</bean>
3:编码测试 package com.offcn;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class App {
public ApplicationContext applicationContext ;
@Before
public void begin(){
applicationContext = new ClassPathXmlApplicationContext(“classpath:spring-redis.xml”);
}
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean(“jedisPool”);
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "lisi");
String name = jedis.get("name");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 关闭连接
jedis.close();
}
}
}
}
RedisTemplate简化Redis操作
JedisConnectionFactory 为 Jedis 连接工厂,配置由单独抽象的 JedisPoolConfig 提供。
RedisTemplate 的作用,RedisTemplate 对 RedisConnection 进行了封装。提供连接管理,序列化等功能,它对 Redis 的交互进行了更高层次的抽象,极大的方便和简化了 Redis 的操作。
Pom.xml
<spring.version>4.3.15.RELEASE</spring.version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.11.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
redis.clients jedis 2.9.0 junit junit 4.12 test
<!-- 配置JedisConnectionFactory -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="192.168.5.129"/>
<property name="port" value="6379"/>
<property name="password" value="123456"/>
<property name="database" value="0"/>
<property name="poolConfig" ref="jedisPoolConfig"/>
</bean>
<!-- 配置jedis模板 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
</bean>
Spring基于注解整合Redis实现内容缓存
创建MAVNE项目准备和Spring注解方式整合Redis所需依赖包
redis.clients
jedis
2.9.0
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.11.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
注意:spring-data-redis 1.8.11.RELEASE版依赖Spring4.3.15.RELEASE
2:在applicationContext.xml中增加Redis和Spring整合相关配置
<?xml version="1.0" encoding="UTF-8"?><cache:annotation-driven />
<!-- 配置 JedisPoolConfig 实例 -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="2"/>
<property name="maxTotal" value="10"/>
<property name="maxWaitMillis" value="3000"/>
<property name="testOnBorrow" value="true"/>
</bean>
<!-- 配置JedisConnectionFactory -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="192.168.132.128"/>
<property name="port" value="6379"/>
<property name="password" value="123456"/>
<property name="database" value="0"/>
<property name="poolConfig" ref="poolConfig"/>
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"/>
</bean>
<!-- 配置RedisCacheManager -->
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
<constructor-arg name="redisOperations" ref="redisTemplate"/>
<property name="defaultExpiration" value="3000"/>
</bean>
cacheManager 做为 redis 统一的调度和管理者
4.在Service实现类增加缓存注解标签
package com.offcn.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import com.offcn.mapper.GoodsDAO;
import com.offcn.po.Goods;
import com.offcn.service.GoodsService;
/**
- 商品业务实现
*/
// 自动添加到Spring容器中
@Service
public class GoodsServiceImpl implements GoodsService {
// 自动装配
@Resource
GoodsDAO goodsdao;
// 分页
@Override
@Cacheable(value="getGoodsPager",key="'getGoodsPager_value_'+#pageNO+'_'+#size")
public List<Goods> getGoodsPager(int pageNO, int size) {
int skip = (pageNO - 1) * size;
return goodsdao.getGoodsPager(skip, size);
}
// 获得单个产品对象
@Override
@Cacheable(value="getGoodsById",key="'getGoodsById_value_'+#id")
public Goods getGoodsById(int id) {
return goodsdao.getGoodsById(id);
}
// 获得商品总数
@Override
@Cacheable(value="getGoodsCount",key="'getGoodsCount_value'")
public int getGoodsCount() {
return goodsdao.getGoodsCount();
}
// 添加
@Override
@CacheEvict(value = { "getGoodsPager", "getGoodsById","getGoodsCount" }, allEntries = true)
public int insert(Goods entity) {
return goodsdao.insert(entity);
}
// 删除单个
@Override
@CacheEvict(value = { "getGoodsPager", "getGoodsById","getGoodsCount" }, allEntries = true)
public int delete(int id) {
return goodsdao.delete(id);
}
// 删除多个
@Override
@CacheEvict(value = { "getGoodsPager", "getGoodsById","getGoodsCount" }, allEntries = true)
public int deletes(int[] ids) {
int rows = 0;
for (int id : ids) {
rows += delete(id);
}
return rows;
}
// 更新
@Override
@CacheEvict(value = { "getGoodsPager", "getGoodsById","getGoodsCount" }, allEntries = true)
public int update(Goods entity) {
return goodsdao.update(entity);
}
}
缓存一般使用在服务层,在你想缓存的方法上面添加相应的注解即可,下面三个缓存的注解要求掌握。
@Cacheable spring 会在其被调用后将返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。
value属性指定Cache名称:value属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。
key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。当我们没有指定该属性时,Spring将使用默认策略生成key。我们这里先来看看自定义策略,至于默认策略会在后文单独介绍。
自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”
@CachePut 标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
@CacheEvict 用来标注在需要清除缓存元素的方法或类上的。
value表示清除操作是发生在哪些Cache上的(对应Cache的名称)。
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。
6:运行测试
前端页面点击分页,查看Redis里面,即可看到相关内容已经缓存进来。