Redis教程

RedisTemplate 切换 Jedis 实现 以及 Jedis 常用 API

本文主要是介绍RedisTemplate 切换 Jedis 实现 以及 Jedis 常用 API,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

RedisTemplate 切换 Jedis 实现

切换底层 Jedis API 操作 Redis


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(接口)

线程安全的连接工厂,用于获取 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

这篇关于RedisTemplate 切换 Jedis 实现 以及 Jedis 常用 API的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!