1 场景
spring中使用jedis
整合单节点
redis。
redis官网:https://redis.io/
spring集成redis官网:https://spring.io/projects/spring-data-redis
1.1 版本说明
jdk版本:1.8
spring版本:5.2.2.RELEASE
spring-data-redis版本:2.3.2.RELEASE
jedis版本:3.3.0
redis版本:5.0.8
连接redis组件:jedis
redis部署方式:单节点
1.2 代码地址
https://github.com/yjhcpdd/mymvc
1.3 项目结构
--java
--resources
--conf
-mybatis-redis.xml**[1]
-spring.xml*********[2]
--properties
-redis.properties***[3]
2 整合步骤
2.1 配置maven依赖
pom.xml中配置相关依赖包(完整配置,可参见源码):
<dependencies>
...
<!-- ==========【redis】========== -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
2.2 配置redis配置文件
创建数据库配置文件redis.properties
[3],增加如下配置:
#redis数据库连接配置
redis.hostName=192.168.1.11
redis.port=6379
redis.password=123456
redis.database=0
2.3 引入redis配置文件
spring配置文件中引入redis配置文件
<context:property-placeholder location="classpath:properties/redis.properties" />
2.4 spring中配置redis
更改jedis的spring配置文件mybatis-redis.xml
[1]
<!-- 密码配置 -->
<bean id="redisPassword" class="org.springframework.data.redis.connection.RedisPassword" factory-method="of">
<constructor-arg name="passwordAsString" value="${redis.password}" />
</bean>
<!-- 连接配置 -->
<bean id="redisStandaloneConfiguration"
class="org.springframework.data.redis.connection.RedisStandaloneConfiguration">
<property name="hostName" value="${redis.hostName}"/>
<property name="port" value="${redis.port}"/>
<property name="password" ref="redisPassword"/>
<property name="database" value="${redis.database}"/>
</bean>
<!-- 连接池配置(根据需要配置连接池优化参数) -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 优化参数 -->
</bean>
<!-- 客户端连接配置 -->
<bean id="jedisClientConfiguration"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory$MutableJedisClientConfiguration"
factory-method="create">
<constructor-arg name="jedisPoolConfig" ref="jedisPoolConfig"/>
</bean>
<!-- 连接工厂 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<!-- "单机"连接配置 -->
<constructor-arg name="standaloneConfig" ref="redisStandaloneConfiguration"/>
<!-- 客户端连接配置 -->
<constructor-arg name="clientConfig" ref="jedisClientConfiguration"/>
</bean>
<!-- 字符串句柄 -->
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<constructor-arg name="connectionFactory" ref="jedisConnectionFactory"/>
</bean>
这里配置了redis常用的操作句柄stringRedisTemplate
,如需要其他句柄实现,可以自己集成泛型类org.springframework.data.redis.core.RedisTemplate
,自定义自己的泛型实现。
3 使用
spring中使用redis,只需要将redis的句柄stringRedisTemplate
注入到spring环境中即可。
@Autowired
private StringRedisTemplate stringRedisTemplate;
句柄使用时,可调用对应的opsForXXX
来操作不同类型的数据,如下:
//字符串句柄写法
stringRedisTemplate.opsForValue().set("k1", "v1");
stringRedisTemplate.opsForValue().get("k1");
在使用此句柄时,不需要自己手动关闭连接,查看源码,可以看到RedisTemplate.java中已经自动执行了连接的回收操作:
@Nullable
<T> T execute(RedisCallback<T> callback, boolean exposeConnection) {
return template.execute(callback, exposeConnection);
}
public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) {
//校验
RedisConnectionFactory factory = getRequiredConnectionFactory();
RedisConnection conn = null;
try {
//真正的数据库操作action
} finally {
RedisConnectionUtils.releaseConnection(conn, factory, enableTransactionSupport);
}
}
4 扩展
如默认jedis默认提供的操作句柄stringRedisTemplate
中提供的方法不能满足自己需求,又不想自定义泛型扩展类RedisTemplate。可以通过stringRedisTemplate
获取原始的
redisTemplate,手动编写回调方法execute,来实现需要的功能:
//调用原生jedis回调写法
stringRedisTemplate.execute((RedisCallback<Object>) connection -> {
connection.flushAll();
return null;
});
此种方式,可以通过更改匿名类中的泛型类型,来设置回调方法返回的数据类型,从而返回相应的执行结果。