上篇讲到redis的客户端基本操作和java操作redis,那么这篇就主要讲spring集成redis
https://blog.csdn.net/qq_38061322/article/details/86738682
一、Spring集成redis
1.1、导包
<!--spring集成redis-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.2</version>
</dependency>
1.2、不利用Spring data-redis整合
这种方式整合灵活性更大
1.2.1、配置spring-redis.xml文件
注意:如果你用的jedis版本与我的不同,可能会导致一些方法属性的增删改,具体需要看源码来排错
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描包-->
<context:component-scan base-package="cn.itsource.redis" />
<!--redis连接池配置信息对象-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--繁忙时最大连接数-->
<property name="maxTotal" value="50" />
<!--设置空闲时最大连接数-->
<property name="maxIdle" value="8" />
<!--设置最大等待时间-->
<property name="maxWaitMillis" value="1000" />
<!-- <property name="testWhileIdle" value="true"/> -->
</bean>
<!--配置连接池-->
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" scope="singleton">
<constructor-arg index="0" ref="jedisPoolConfig" />
<!--redis客户端配置-->
<constructor-arg index="1">
<list>
<bean class="redis.clients.jedis.JedisShardInfo">
<!--设置redis登录密码-->
<property name="password" value="123456" />
<!--ip地址-->
<constructor-arg name="host" value="localhost" />
<!--端口号-->
<constructor-arg name="port" value="6379" />
<!--超时时间-->
<constructor-arg name="timeout" value="2000" />
</bean>
</list>
</constructor-arg>
</bean>
</beans>
1.2.2、定义一个接口
public interface RedisDataSource {
public abstract ShardedJedis getRedisClient();
public void returnResource(ShardedJedis shardedJedis);
public void returnResource(ShardedJedis shardedJedis,boolean broken);
}
1.2.3、实现该接口
@Repository("redisDataSource")
public class RedisDataSourceImpl implements RedisDataSource {
private static final Logger log = LoggerFactory.getLogger(RedisDataSourceImpl.class);
@Autowired
private ShardedJedisPool shardedJedisPool;
/**
* 取得redis的客户端,可以执行命令了。
* @return
*/
@Override
public ShardedJedis getRedisClient() {
try {
ShardedJedis shardJedis = shardedJedisPool.getResource();
return shardJedis;
} catch (Exception e) {
log.error("getRedisClent error", e);
}
return null;
}
/**
* 将资源返还给pool
* @param shardedJedis
*/
@Override
public void returnResource(ShardedJedis shardedJedis) {
shardedJedisPool.returnResource(shardedJedis);
}
/**
* 出现异常后,将资源返还给pool (其实不需要第二个方法)
* @param shardedJedis
* @param broken
*/
@Override
public void returnResource(ShardedJedis shardedJedis, boolean broken) {
if (broken) {
shardedJedisPool.returnBrokenResource(shardedJedis);
} else {
shardedJedisPool.returnResource(shardedJedis);
}
}
}
1.2.4、第二层封装
第二层的封装:RedisClientTemplate,例子实现了放值和取值。最后代码提供了全部命令的实现。
代码就是映射性质的又一次调用jedis的方法而已,用了个broken来做标示符,决定返还资源的方式。
这一层的目的主要也是让再上层的调用不需要关心pool中链接的取得和返还问题了。
@Repository("redisClientTemplate")
public class RedisClientTemplate {
private static final Logger log = LoggerFactory.getLogger(RedisClientTemplate.class);
@Autowired
private RedisDataSource redisDataSource;
public void disconnect() {
ShardedJedis shardedJedis = redisDataSource.getRedisClient();
shardedJedis.disconnect();
}
/**
* 设置单个值
*
* @param key
* @param value
* @return
*/
public String set(String key, String value) {
String result = null;
ShardedJedis shardedJedis = redisDataSource.getRedisClient();
if (shardedJedis == null) {
return result;
}
boolean broken = false;
try {
result = shardedJedis.set(key, value);
} catch (Exception e) {
log.error(e.getMessage(), e);
broken = true;
} finally {
redisDataSource.returnResource(shardedJedis, broken);
}
return result;
}
/**
* 获取单个值
*
* @param key
* @return
*/
public String get(String key) {
String result = null;
ShardedJedis shardedJedis = redisDataSource.getRedisClient();
if (shardedJedis == null) {
return result;
}
boolean broken = false;
try {
result = shardedJedis.get(key);
} catch (Exception e) {
log.error(e.getMessage(), e);
broken = true;
} finally {
redisDataSource.returnResource(shardedJedis, broken);
}
return result;
}
}
1.2.5、简单测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-redis.xml")
public class SpringRedisTest {
@Autowired
RedisClientTemplate redisClientTemplate;
@Test
public void test() throws Exception{
redisClientTemplate.set("username", "ykf");
System.err.println("====="+redisClientTemplate.get("username"));
}
}