目录
Redistemplate 切换 Jedis 实现
1、Spring Boot 为 Lettuce 和 Jedis 客户端库提供基本的自动配置,默认情况下,使用 Lettuce 作为客户端,如果想要切换 Jedis 客户端,则分为如下两步:
一:切换依赖:排除掉 spring-boot-starter-data-redis 中默认的 lettuce 依赖,然后引入 jedis 依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!--排除掉默认的 lettuce-->
<exclusions>
<exclusion>
<artifactId>lettuce-core</artifactId>
<groupId>io.lettuce</groupId>
</exclusion>
</exclusions>
</dependency>
<!--引入 jedis 依赖。内部依赖了 commons-pool2 连接池 -->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
二:修改配置:将 lettuce 配置切换为 jedis 配置
#Redis 配置,以下除了 timeout 外全部为默认配置.
spring:
redis:
host: localhost
port: 6379
database: 2
password:
timeout: 10000
jedis:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: -1ms
三:切换原理
1、应用启动时,自动加载 org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration 配置类。
@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
2、如果应用中有 lettuce 依赖,则会自动使用 Lettuce 客户端,同理如果应用中有 jedis 依赖,则自动换为 Jedis 客户端。
演示源码:src/main/resources/application.yml · 汪少棠/wmx-redis - Gitee.com
切换底层 Jedis API 操作 Redis
1、Redistemplate 底层支持 Lettuce 客户端(默认)、Jedis 客户端,而 redis 数据库又可以单机部署、集群部署,不同的客户端、不同的部署方式底层使用的 API 都不相同。
Redistemplate(类) | RedisAutoConfiguration 中已经自动将 Redistemplate 添加到了容器中,直接获取使用即可. |
StringRedistemplate(类) | 继承自 Redistemplate,RedisAutoConfiguration 启动时已经添加到了容器中,可以直接获取使用。 |
RedisConnectionFactory(接口) | |
JedisConnectionFactory(类) | 实现了 RedisConnectionFactory(接口) |
LettuceConnectionFactory(类) | 实现了 RedisConnectionFactory(接口) |
RedisConnection(接口) | |
JedisConnection(类) | 实现 RedisConnection(接口) |
LettuceConnection(类) | 实现 RedisConnection(接口) |
RedisClusterConnection(接口) | 继承 RedisConnection(接口),面向 redis 集群部署的分布式连接 |
JedisClusterConnection(类) | 实现了 RedisClusterConnection(接口) |
LettuceClusterConnection(类) | 实现了 RedisClusterConnection(接口) |
2、 强烈推荐直接使用 RedisTemplate、StringRedisTemplate 模板,这样就不再需要自己去释放或者关闭连接,而只需要关注操作数据即可。优先面向接口编程,否则一旦切换了底层 redis 客户端,或者换了 Redis 部署方式,则还需要改实现代码。
3、实际开发中可能就是想要使用底层的 Jedis 或者 Lettuce 客户端 API,比如上层 Redistemplate 没有封装某些方法,这些特色 API 只在底层 Jedis 或者 Lettuce 中才有。
/**
* 线程安全的 Redis 连接工厂,{@link RedisAutoConfiguration} 启动已经添加到了容器中,可以直接获取使用
* RedisConnectionFactory Redistemplate.getConnectionFactory(): 也可以获取 RedisConnectionFactory 连接工厂
*/
@Resource
private RedisConnectionFactory redisConnectionFactory;
/**http://localhost:8080/jedis/getJedis
* @return
*/
@GetMapping("/jedis/getJedis")
public Map<String, Object> getJedis() {
Map<String, Object> resultMap = new HashMap<>(8);
resultMap.put("code", 200);
JedisConnection jedisConnection = null;
try {
/**
* RedisConnectionFactory getrequiredConnectionFactory():获取 ConnectionFactory 连接工厂,未设置时,抛异常.
* RedisConnection getConnection(RedisConnectionFactory factory): 从工厂获取 Redis 连接
* * 1、返回绑定到当前线程的任何现有对应连接,例如在使用事务管理器时,否则将始终创建新连接。
* * 2、factory:用于创建连接的参数工厂连接工厂
* * 3、返回没有事务管理的活动 Redis 连接
* RedisConnection getConnection(RedisConnectionFactory factory, boolean enableTranactionSupport):从工厂获取 Redis 连接
* * 1、enableTranactionSupport 如果为 true,则返回带有事务管理的活动 Redis 连接
*/
jedisConnection = (JedisConnection) RedisConnectionUtils.getConnection(redisConnectionFactory, true);
// 有了 Jedis 则可以使用它的任意方法操作 Redis 了
Jedis jedis = jedisConnection.getNativeConnection();
Set<String> keys = jedis.keys("*");
resultMap.put("data", keys);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
resultMap.put("code", 500);
resultMap.put("msg", e.getMessage());
resultMap.put("data", null);
} finally {
/**
* releaseConnection(@Nullable RedisConnection conn, RedisConnectionFactory factory):关闭通过给定工厂创建的给定连接(如果未进行外部管理(即未绑定到线程)
* * conn: 要关闭的 Redis 连接。
* * factory:用于创建连接的 Redis 工厂
*/
if (jedisConnection != null) {
RedisConnectionUtils.releaseConnection(jedisConnection, redisConnectionFactory);
}
}
return resultMap;
}
在线演示源码:src/main/java/com/wmx/wmxredis/jedis/JedisController.java · 汪少棠/wmx-redis - Gitee.com
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。