目录
RedisTemplate 切换 Jedis 实现
切换底层 Jedis API 操作 Redis
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
1、RedisTemplate 底层支持 Lettuce 客户端(默认)、Jedis 客户端,而 redis 数据库又可以单机部署、集群部署,不同的客户端、不同的部署方式底层使用的 API 都不相同。
RedisTemplate(类) | RedisAutoConfiguration 中已经自动将 RedisTemplate 添加到了容器中,直接获取使用即可. |
StringRedisTemplate(类) | 继承自 RedisTemplate,RedisAutoConfiguration 启动时已经添加到了容器中,可以直接获取使用。 |
RedisConnectionFactory(接口) | 线程安全的连接工厂,用于获取 redis 连接。 RedisAutoConfiguration 启动时已经添加到了容器中,可以直接获取使用。 |
JedisConnectionFactory(类) | 实现了 RedisConnectionFactory(接口) |
LettuceConnectionFactory(类) | 实现了 RedisConnectionFactory(接口) |
RedisConnection(接口) | 与Redis服务器的连接。充当各种Redis客户端库(或驱动程序)的通用抽象。 有了连接就可以操作 redis 数据库,它的实现很多,下面几个是常用的。 |
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